Hibernate多對(duì)多怎么實(shí)現(xiàn)

本篇內(nèi)容主要講解“Hibernate多對(duì)多怎么實(shí)現(xiàn)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Hibernate多對(duì)多怎么實(shí)現(xiàn)”吧!

10年積累的網(wǎng)站制作、網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有安龍免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

假設(shè)現(xiàn)在有User與Server兩個(gè)類別,一個(gè)User可以被授權(quán)使用多臺(tái)Server,而在Server上也記錄授權(quán)使用它的使用者,就User與Server兩者而言即使多對(duì)多的關(guān)係。

在程式設(shè)計(jì)時(shí),基本上是不建議直接在User與Server之間建立多對(duì)多關(guān)係,這會(huì)使得User與Server相互依賴,通常會(huì)透過一個(gè)中介類別來維護(hù)兩者之間的多對(duì)多關(guān)係,避免兩者的相互依賴。

如果一定要直接建立User與Server之間的多對(duì)多關(guān)係,Hibernate也是支援的,基本上只要您瞭解之前介紹的幾個(gè)實(shí)體映射,建立多對(duì)多關(guān)聯(lián)在配置上並不困難。

先看一下我們?cè)O(shè)計(jì)的User與Server類別:

java 代碼

  1. package onlyfun.caterpillar;

  2. import java.util.*;

  3. publicclass User {

  4. privatelong id;

  5. private String name;

  6. private Set servers = new HashSet();

  7. publiclong getId() {

  8. return id;

  9. }

  10. publicvoid setId(long id) {

  11. this.id = id;

  12. }

  13. public String getName() {

  14. return name;

  15. }

  16. publicvoid setName(String name) {

  17. this.name = name;

  18. }

  19. public Set getServers() {

  20. return servers;

  21. }

  22. publicvoid setServers(Set servers) {

  23. this.servers = servers;

  24. }

  25. }

java 代碼

  1. package onlyfun.caterpillar;

  2. import java.util.*;

  3. publicclass Server {

  4. privatelong id;

  5. private String address;

  6. private Set users = new HashSet();

  7. publiclong getId() {

  8. return id;

  9. }

  10. publicvoid setId(long id) {

  11. this.id = id;

  12. }

  13. public String getAddress() {

  14. return address;

  15. }

  16. publicvoid setAddress(String address) {

  17. this.address = address;

  18. }

  19. public Set getUsers() {

  20. return users;

  21. }

  22. publicvoid setUsers(Set users) {

  23. this.users = users;

  24. }

  25. }

這邊各使用HashSet來保存彼此的關(guān)係,在多對(duì)多關(guān)係映射上,我們可以建立單向或雙向關(guān)係,這邊直接介紹雙向關(guān)係映射,並藉由設(shè)定inverse="true",將關(guān)係的維護(hù)交由其中一方來維護(hù),這麼作的結(jié)果,在原始碼的撰寫上,也比較符合Java的物件關(guān)係維護(hù),也就是雙方都要設(shè)置至對(duì)方的參考。

首先來看看User.hbm.xml:

xml 代碼

  1. xmlversion="1.0"?>

  2. PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"

  3. "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

  4. <hibernate-mapping>

  5. <classname="onlyfun.caterpillar.User"table="USER">

  6. <idname="id"column="USER_ID"unsaved-value="0">

  7. <generatorclass="increment"/>

  8. id>

  9. <propertyname="name">

  10. <columnname="NAME"length="16"not-null="true"/>

  11. property>

  12. <setname="servers"

  13. table="USER_SERVER"

  14. cascade="save-update">

  15. <keycolumn="USER_ID"/>

  16. <many-to-manyclass="onlyfun.caterpillar.Server"

  17. column="SERVER_ID"/>

  18. set>

  19. class>

  20. hibernate-mapping>

在資料庫(kù)中,資料表之間的多對(duì)多關(guān)係是透過一個(gè)中介的資料表來完成,例如在這個(gè)例子中,USER資料表與USER_SERVER資料表是一對(duì)多,而USER_SERVER對(duì)SERVER是多對(duì)一,從而完成USER至SERVER的多對(duì)多關(guān)係,在USER_SERVER資料表中,將會(huì)有USER_ID與SERVER_ID共同作為主鍵,USER_ID作為一個(gè)至USER的外鍵參考,而SERVER_ID作為一個(gè)至SERVER的外鍵參考。

來看看Server.hbm.xml映射文件:

xml 代碼

  1. xmlversion="1.0"?>

  2. PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"

  3. "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

  4. <hibernate-mapping>

  5. <classname="onlyfun.caterpillar.Server"table="SERVER">

  6. <idname="id"column="SERVER_ID"unsaved-value="0">

  7. <generatorclass="increment"/>

  8. id>

  9. <propertyname="address"type="string"/>

  10. <setname="users"

  11. table="USER_SERVER"

  12. inverse="true"

  13. cascade="save-update">

  14. <keycolumn="SERVER_ID"/>

  15. <many-to-manyclass="onlyfun.caterpillar.User"

  16. column="USER_ID"/>

  17. set>

  18. class>

  19. hibernate-mapping>

設(shè)置上與User.hbm.xml是類似的,只是增加了inverse="true",表示將關(guān)係的維護(hù)交由另一端,注意我們?cè)赨ser與Server的cascade都是設(shè)置為save-update,在多對(duì)多的關(guān)係中,all、delete等cascade是沒有意義的,因?yàn)槎鄬?duì)多中,並不能因?yàn)楦肝锛粍h除,而造成被包括的子物件被刪除,因?yàn)榭赡苓€有其它的父物件參考至這個(gè)子物件。

我們使用下面這個(gè)程式來測(cè)試:

java 代碼

  1. import onlyfun.caterpillar.*;

  2. import net.sf.hibernate.*;

  3. import net.sf.hibernate.cfg.*;

  4. publicclass HibernateTest {

  5. publicstaticvoid main(String[] args) throws HibernateException {

  6. SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

  7. Server server1 = new Server();

  8. server1.setAddress("PC-219");

  9. Server server2 = new Server();

  10. server2.setAddress("PC-220");

  11. Server server3 = new Server();

  12. server3.setAddress("PC-221");

  13. User user1 = new User();

  14. user1.setName("caterpillar");

  15. User user2 = new User();

  16. user2.setName("momor");

  17. user1.getServers().add(server1);

  18. user1.getServers().add(server2);

  19. user1.getServers().add(server3);

  20. server1.getUsers().add(user1);

  21. server2.getUsers().add(user1);

  22. server3.getUsers().add(user1);

  23. user2.getServers().add(server1);

  24. user2.getServers().add(server3);

  25. server1.getUsers().add(user2);

  26. server3.getUsers().add(user2);

  27. Session session = sessionFactory.openSession();

  28. Transaction tx= session.beginTransaction();

  29. session.save(user1);

  30. session.save(user2);

  31. tx.commit();

  32. session.close();

  33. sessionFactory.close();

  34. }

  35. }

注意由於設(shè)定了inverse="true",所以必須分別設(shè)定User與Server之間的相互參考,來看看實(shí)際上資料庫(kù)中是如何儲(chǔ)存的:

select * FROM USER

+---------+-------------+
| USER_ID | NAME |
+---------+-------------+
| 1 | caterpillar |
| 2 | momor |
+---------+-------------+

select * FROM USER_SERVER

+-----------------+--------------+
| SERVER_ID | USER_ID |
+-----------------+--------------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 1 | 2 |
| 2 | 2 |
+-----------------+--------------+

select * FROM SERVER

+-----------------+------------+
| SERVER_ID | address |
+-----------------+------------+
| 1 | PC-219 |
| 2 | PC-221 |
| 3 | PC-220 |
+-----------------+-------------+

到此,相信大家對(duì)“Hibernate多對(duì)多怎么實(shí)現(xiàn)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

本文標(biāo)題:Hibernate多對(duì)多怎么實(shí)現(xiàn)
本文URL:http://muchs.cn/article14/ipigde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、網(wǎng)站改版、網(wǎng)頁(yè)設(shè)計(jì)公司企業(yè)網(wǎng)站制作、App開發(fā)品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司