Hibernate關系映射(一) 基於外鍵的單向一對一


模擬用戶和地址的映射關系,一個用戶只有一個地址,用戶知道地址,但是地址不知道用戶。用戶對地址的單向一對一映射。

一、建立實體類

Account.cs類

package com.lxit.entity;

import java.io.Serializable;

public class Account implements Serializable{
    public Account(){
        
    }
    private int id;
    private String name;
    private String password;
    //需要添加被控端的引用
    private Address address;
    
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    
}

Address.cs類  地址類

package com.lxit.entity;

import java.io.Serializable;

public class Address implements Serializable{
    public Address(){
        
    }
    private int id;
    private String name;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
}

 

二、映射文件

Account.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
 <class name="com.lxit.entity.Account" table="Account">
  <id column="id" name="id">
   <generator class="native"/>
  </id>
  <property column="name" generated="never" lazy="false" name="name"/>
  <property column="password" generated="never" lazy="false" name="password"/>
  <!-- 通過many-to-one 標簽添加唯一屬性約束,建立一對一關聯關系 -->
  <many-to-one column="address_id" name="address" unique="true"/>
  <!-- 必須通過映射關系生成的表才會生成唯一約束,否則不會生成 -->
 </class>
</hibernate-mapping>

 

Address.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
 <class name="com.lxit.entity.Address" table="Address">
  <id column="id" name="id">
   <generator class="native"/>
  </id>
  <property column="name" generated="never" lazy="false" name="name"/>
 </class>
</hibernate-mapping>

 

三、HibernateUtil工具類

package com.lxit.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * Hibernate3.3工具類
 * @author Administrator
 *
 */
public class HibernateUtil {
    private static SessionFactory factory;
    
    static{
        Configuration cfg = new Configuration().configure();
        factory = cfg.buildSessionFactory();        
    }
    
    public static SessionFactory getFactory(){
        return factory;
    }
    
    public static Session getSession(){
        return factory.openSession();
    }
    
    public static void CloseSession(Session session){
        if(session != null){
            session.close();
        }
    }    
}

 

 

四、hibernate.cfg.xml配置文件

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory name="foo">
    <!-- 配置數據庫連接 -->
    <property name="hibernate.dialect">
        org.hibernate.dialect.MySQL5Dialect
    </property>
    <property name="hibernate.connection.driver_class">
        com.mysql.jdbc.Driver
    </property>
    <property name="hibernate.connection.url">
        jdbc:mysql://127.0.0.1:3306/test
    </property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>

    <property name="show_sql">true</property>
    <property name="format_sql">true</property>

    <property name="hbm2ddl.auto">update</property>
    <mapping resource="com/lxit/entity/Account.hbm.xml" />
    <mapping resource="com/lxit/entity/Address.hbm.xml" />

</session-factory>
</hibernate-configuration>

 

五、Jutil測試類

package com.lxit.demo2.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.lxit.entity.Account;
import com.lxit.entity.Address;
import com.lxit.util.HibernateUtil;


public class AccountTest {
    
    @Test
    public void Add(){
        Transaction tx = null;
        Session session = HibernateUtil.getSession();
        tx = session.beginTransaction();
        
        Address address= new Address();
        address.setName("深圳寶安");        
        session.save(address);
        
        Account account = new Account();
        account.setName("zhangsan");
        account.setPassword("123");
        account.setAddress(address);
        
        try {
            session.save(account);
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }finally{
            HibernateUtil.CloseSession(session);
        }     
    }
    
    @Test
    public void Add2(){
        Transaction tx = null;
        Session session = HibernateUtil.getSession();
        tx = session.beginTransaction();
        
        Address address= new Address();
        address.setName("深圳福田");        
        session.save(address);
        
        Account account1 = new Account();
        account1.setName("lisi");
        account1.setPassword("123");
        account1.setAddress(address);
        
        Account account2 = new Account();
        account2.setName("wangwu");
        account2.setPassword("123");
        account2.setAddress(address);
        
        try {
            //重復添加第二個用戶,地址相同,則會報錯
            session.save(account1);
            session.save(account2);
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }finally{
            HibernateUtil.CloseSession(session);
        }        
    }
}

 

總結:單向一對一必須通過實體類生成數據庫表的方式,會自動生成相關的約束,直接創建表無效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM