1. 程式人生 > >Hibernate(5.3.7)的三種關聯關係

Hibernate(5.3.7)的三種關聯關係

1、一對多(雙向關聯)

雙向關聯較為耗費資源,因此在實際開發中,使用單向關聯(在下文程式碼中有註釋)即可。
多的一方的POJO類需要有私有化的一的一方的例項即:

//多對一客戶類屬性
private Customer customer;

一的一方的POJO類需要有私有化的多的一方的Set集合:

//一對多訂單集合
private Set<Order> orderSet = new HashSet<Order>();

多的一方(order)的hbm.xml檔案:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="wan.bean.Order" table="orders">
        <id name="id" type="int">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="amount" type="double">
            <column name="amount" />
        </property>
        <property name="address" type="string">
            <column name="address" />
        </property>
        
        <many-to-one name="customer" class="wan.bean.Customer" fetch="join">
            <column name="customer_id" />
        </many-to-one>
        
    </class>
</hibernate-mapping>

一的一方(customer)的hbm.xml檔案:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="wan.bean.Customer" table="customer">
        <id name="id" type="int">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="name" type="string">
            <column name="name" />
        </property>
        
        <set name="orderSet" table="orders" inverse="false">
        	<!-- 外來鍵 -->
            <key>
                <column name="customer_id"/>
            </key>
            <one-to-many class="wan.bean.Order" />
        </set>
        
    </class>
</hibernate-mapping>

測試:

@Test
	public void testAdd2() {
		//獲得session物件
		Session session = getSession();
		//通過session開啟事務
		Transaction trans = session.beginTransaction();
		
		//建立一個客戶物件
		Customer customer = new Customer();
		customer.setName("馬雲");
		//建立兩個訂單
		Order order1 = new Order(1000,"矽谷");
		Order order2 = new Order(2000, "大學城");
		//將訂單加入到客戶物件中,建立聯絡
		//customer.getOrderSet().add(order1);(註釋之後,便是單向關聯)
		//customer.getOrderSet().add(order2);(註釋之後,便是單向關聯)
		//當關系由多的一方維護時,需要新增以下的關係
		order1.setCustomer(customer);
		order2.setCustomer(customer);
		
		//直接儲存客戶
		session.save(customer);
		session.save(order1);
		session.save(order2);
		
		//提交事務
		trans.commit();
	}

2、多對多(單向關聯)

一方的POJO類需要有私有化另一方的集合即:

//多對多的老師集合,在Class類中
private Set<Teacher> teacherSet = new HashSet<Teacher>();
//多對多的班級集合,在Teacher類中
private Set<Classes> classesSet = new HashSet<Classes>();

(Class)的hbm.xml檔案:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="wan.bean">
    <class name="Classes" table="classes">
        <id name="id" type="int">
            <column name="id" />
            <generator class="native" />
        </id>    
        <property name="cname" />
        
        <!-- 外來鍵,對應得表為中間表,對應鍵為c_id -->
        <set name="teacherSet" table="classes_teacher" >
            <key>
                <column name="c_id"/>
            </key>
            <!-- 多對多對應Teacher POJO類,該類對應中間表的t_id  -->
            <many-to-many class="Teacher" column="t_id"/>
        </set>
        
    </class>
</hibernate-mapping>

(Teacher)的hbm.xml檔案:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="wan.bean">
    <class name="Teacher" table="teacher">
        <id name="id" type="int">
            <column name="id" />
            <generator class="native" />
        </id>        
        <property name="name"/>
            
         <!-- 外來鍵,對應得表為中間表,對應鍵為t_id -->
        <set name="classesSet" table="classes_teacher">
            <key>
                <column name="t_id" />
            </key>
            <!-- 多對多對應Classes POJO類,該類對應中間表的c_id -->
            <many-to-many class="Classes" column="c_id"/>
        </set>
        
    </class>
</hibernate-mapping>

3、一對一:

一對一就是最簡單的普通操作,我就不寫了。