Hibernate(5.3.7)的三種關聯關係
阿新 • • 發佈:2018-12-09
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、一對一:
一對一就是最簡單的普通操作,我就不寫了。