上篇文章《
Eclipse快速上手Hibernate--7. 關(guān)聯(lián)映射(一對(duì)多) (1)》已經(jīng)說(shuō)了一對(duì)多的單向關(guān)聯(lián),這次還是用Room和User類(lèi)來(lái)說(shuō)明多對(duì)一的單向關(guān)聯(lián),只不過(guò)這次關(guān)聯(lián)關(guān)系是由User對(duì)象維持的。
由于有了上篇文章的基礎(chǔ),只要做些修改就可以了。
· 修改Room類(lèi),僅僅是刪除了關(guān)聯(lián)User類(lèi)的代碼。
package javamxj.hibernate.association.one2many;/** * @hibernate.class table = "T_Room" */public class Room { private Long id; private String address; /** * @hibernate.id * column="ID" * generator-class="hilo" * unsaved-value="null" */ public Long getId() { return id; } public void setId(Long id) { this.id = id; } /** * @hibernate.property length = "24" */ public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
· 同樣修改User類(lèi),也是僅僅添加了關(guān)聯(lián)Room類(lèi)的代碼。
package javamxj.hibernate.association.one2many;/** * @hibernate.class table = "T_User" */public class User { private Long id; private String name; private Room room; /** * @hibernate.id * column="ID" * generator-class="hilo" * unsaved-value="null" */ public Long getId() { return id; } public void setId(Long id) { this.id = id; } /** * @hibernate.property length = "24" */ public String getName() { return name; } public void setName(String name) { this.name = name; } /** * @hibernate.many-to-one * cascade="save-update" * column="Room_ID" */ public Room getRoom() { return room; } public void setRoom(Room room) { this.room = room; } }
· 在最后幾行中指明了引用Room類(lèi)的方式,其中@hibernate.many-to-one 表明在T_User表定義了外鍵Room_ID。通過(guò)這個(gè)外鍵來(lái)反映多對(duì)一關(guān)系。
· 看看Room類(lèi)的映射文件中的有關(guān)多對(duì)一關(guān)聯(lián)部分:
<many-to-one
name="room"
class="javamxj.hibernate.association.one2many.Room"
cascade="save-update"
outer-join="auto"
update="true"
insert="true"
access="property"
column="Room_ID"
/>
· 這次級(jí)聯(lián)關(guān)系是 cascade="save-update", 當(dāng)刪除多的一方中的一個(gè)對(duì)象時(shí),其所關(guān)聯(lián)的一的一方并不能同時(shí)被刪除,因?yàn)樗锌赡苓€關(guān)聯(lián)著多的一方中的其它對(duì)象,所以這次不用 cascade="all" 了。
· 修改Demo.java文件,User通過(guò)級(jí)聯(lián)來(lái)更新Room。
/* * Hibernate - 關(guān)聯(lián)(Association)映射(一對(duì)多) * 創(chuàng)建日期 2005-4-27 * @author javamxj(分享java快樂(lè)) * @link Blog: htpp://blog.csdn.net/javamxj/ * htpp://javamxj.mblogger.cn */package javamxj.hibernate.association.one2many;import net.sf.hibernate.*;import net.sf.hibernate.cfg.*;public class Demo { public static void main(String[] args) throws HibernateException { Room room1 = new Room(); room1.setAddress("科研007"); Room room2 = new Room(); room2.setAddress("銷(xiāo)售001"); User user1 = new User(); user1.setName("張三"); user1.setRoom(room1); User user2 = new User(); user2.setName("李四"); user2.setRoom(room1); User user3 = new User(); user3.setName("王二"); user3.setRoom(room2); SessionFactory sf= new Configuration().configure().buildSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); session.save(user1); session.save(user2); session.save(user3); tx.commit(); session.close(); sf.close(); }}
· 然后同上面文章一樣,生成映射文件,生成表,執(zhí)行Demo,最后數(shù)據(jù)表中生成如下數(shù)據(jù):
· 同時(shí),控制臺(tái)輸出如下:
可以看到,多對(duì)一關(guān)聯(lián)相比一對(duì)多關(guān)聯(lián),只用了5條語(yǔ)句就完成了相同的操作結(jié)果。由于關(guān)聯(lián)關(guān)系由User對(duì)象維持的,每個(gè)User都對(duì)應(yīng)至一個(gè)Room。它首先存儲(chǔ)的是Room對(duì)象,在存儲(chǔ)User對(duì)象時(shí),因?yàn)閁ser已經(jīng)知道Room的存在,所以可以通過(guò)關(guān)聯(lián)字段Room_ID將User對(duì)象對(duì)Room對(duì)象的關(guān)系一并存儲(chǔ)在T_User表中了。
這兩篇文章談?wù)摰亩际菃蜗蜿P(guān)聯(lián),如果Room類(lèi)和User類(lèi)存在雙向關(guān)聯(lián),又該如何呢?下篇文章見(jiàn)。