本篇内容主要讲解“Hibernate多对多怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Hibernate多对多怎么实现”吧!

10年积累的网站制作、网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有安龙免费网站建设让你可以放心的选择与我们合作。
假設現在有User與Server兩個類別,一個User可以被授權使用多台Server,而在Server上也記錄授權使用它的使用者,就User與Server兩者而言即使多對多的關係。
在程式設計時,基本上是不建議直接在User與Server之間建立多對多關係,這會使得User與Server相互依賴,通常會透過一個中介類別來維護兩者之間的多對多關係,避免兩者的相互依賴。
如果一定要直接建立User與Server之間的多對多關係,Hibernate也是支援的,基本上只要您瞭解之前介紹的幾個實體映射,建立多對多關聯在配置上並不困難。
先看一下我們設計的User與Server類別:
java 代码
- package onlyfun.caterpillar; 
- import java.util.*; 
- publicclass User { 
- privatelong id; 
- private String name; 
- private Set servers = new HashSet(); 
- publiclong getId() { 
- return id; 
- } 
- publicvoid setId(long id) { 
- this.id = id; 
- } 
- public String getName() { 
- return name; 
- } 
- publicvoid setName(String name) { 
- this.name = name; 
- } 
- public Set getServers() { 
- return servers; 
- } 
- publicvoid setServers(Set servers) { 
- this.servers = servers; 
- } 
- } 
java 代码
- package onlyfun.caterpillar; 
- import java.util.*; 
- publicclass Server { 
- privatelong id; 
- private String address; 
- private Set users = new HashSet(); 
- publiclong getId() { 
- return id; 
- } 
- publicvoid setId(long id) { 
- this.id = id; 
- } 
- public String getAddress() { 
- return address; 
- } 
- publicvoid setAddress(String address) { 
- this.address = address; 
- } 
- public Set getUsers() { 
- return users; 
- } 
- publicvoid setUsers(Set users) { 
- this.users = users; 
- } 
- } 
這邊各使用HashSet來保存彼此的關係,在多對多關係映射上,我們可以建立單向或雙向關係,這邊直接介紹雙向關係映射,並藉由設定inverse="true",將關係的維護交由其中一方來維護,這麼作的結果,在原始碼的撰寫上,也比較符合Java的物件關係維護,也就是雙方都要設置至對方的參考。
首先來看看User.hbm.xml:
xml 代码
- xmlversion="1.0"?> 
- PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" 
- "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> 
- id> 
- property> 
- table="USER_SERVER" 
- cascade="save-update"> 
- column="SERVER_ID"/> 
- set> 
- class> 
- hibernate-mapping> 
在資料庫中,資料表之間的多對多關係是透過一個中介的資料表來完成,例如在這個例子中,USER資料表與USER_SERVER資料表是一對多,而USER_SERVER對SERVER是多對一,從而完成USER至SERVER的多對多關係,在USER_SERVER資料表中,將會有USER_ID與SERVER_ID共同作為主鍵,USER_ID作為一個至USER的外鍵參考,而SERVER_ID作為一個至SERVER的外鍵參考。
來看看Server.hbm.xml映射文件:
xml 代码
- xmlversion="1.0"?> 
- PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" 
- "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> 
- id> 
- table="USER_SERVER" 
- inverse="true" 
- cascade="save-update"> 
- column="USER_ID"/> 
- set> 
- class> 
- hibernate-mapping> 
設置上與User.hbm.xml是類似的,只是增加了inverse="true",表示將關係的維護交由另一端,注意我們在User與Server的cascade都是設置為save-update,在多對多的關係中,all、delete等cascade是沒有意義的,因為多對多中,並不能因為父物件被刪除,而造成被包括的子物件被刪除,因為可能還有其它的父物件參考至這個子物件。
我們使用下面這個程式來測試:
java 代码
- import onlyfun.caterpillar.*; 
- import net.sf.hibernate.*; 
- import net.sf.hibernate.cfg.*; 
- publicclass HibernateTest { 
- publicstaticvoid main(String[] args) throws HibernateException { 
- SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
- Server server1 = new Server(); 
- server1.setAddress("PC-219"); 
- Server server2 = new Server(); 
- server2.setAddress("PC-220"); 
- Server server3 = new Server(); 
- server3.setAddress("PC-221"); 
- User user1 = new User(); 
- user1.setName("caterpillar"); 
- User user2 = new User(); 
- user2.setName("momor"); 
- user1.getServers().add(server1); 
- user1.getServers().add(server2); 
- user1.getServers().add(server3); 
- server1.getUsers().add(user1); 
- server2.getUsers().add(user1); 
- server3.getUsers().add(user1); 
- user2.getServers().add(server1); 
- user2.getServers().add(server3); 
- server1.getUsers().add(user2); 
- server3.getUsers().add(user2); 
- Session session = sessionFactory.openSession(); 
- Transaction tx= session.beginTransaction(); 
- session.save(user1); 
- session.save(user2); 
- tx.commit(); 
- session.close(); 
- sessionFactory.close(); 
- } 
- } 
注意由於設定了inverse="true",所以必須分別設定User與Server之間的相互參考,來看看實際上資料庫中是如何儲存的:
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 |
+-----------------+-------------+
到此,相信大家对“Hibernate多对多怎么实现”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
标题名称:Hibernate多对多怎么实现
转载来源:http://www.scyingshan.cn/article/ipigde.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 