千家信息网

Hibernate多对多怎么实现

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇内容主要讲解"Hibernate多对多怎么实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Hibernate多对多怎么实现"吧!假設現在有User與
千家信息网最后更新 2026年10月31日Hibernate多对多怎么实现

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

假設現在有User與Server兩個類別,一個User可以被授權使用多台Server,而在Server上也記錄授權使用它的使用者,就User與Server兩者而言即使多對多的關係。

在程式設計時,基本上是不建議直接在User與Server之間建立多對多關係,這會使得User與Server相互依賴,通常會透過一個中介類別來維護兩者之間的多對多關係,避免兩者的相互依賴。

如果一定要直接建立User與Server之間的多對多關係,Hibernate也是支援的,基本上只要您瞭解之前介紹的幾個實體映射,建立多對多關聯在配置上並不困難。

先看一下我們設計的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來保存彼此的關係,在多對多關係映射上,我們可以建立單向或雙向關係,這邊直接介紹雙向關係映射,並藉由設定inverse="true",將關係的維護交由其中一方來維護,這麼作的結果,在原始碼的撰寫上,也比較符合Java的物件關係維護,也就是雙方都要設置至對方的參考。

首先來看看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>

在資料庫中,資料表之間的多對多關係是透過一個中介的資料表來完成,例如在這個例子中,USER資料表與USER_SERVER資料表是一對多,而USER_SERVER對SERVER是多對一,從而完成USER至SERVER的多對多關係,在USER_SERVER資料表中,將會有USER_ID與SERVER_ID共同作為主鍵,USER_ID作為一個至USER的外鍵參考,而SERVER_ID作為一個至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>

設置上與User.hbm.xml是類似的,只是增加了inverse="true",表示將關係的維護交由另一端,注意我們在User與Server的cascade都是設置為save-update,在多對多的關係中,all、delete等cascade是沒有意義的,因為多對多中,並不能因為父物件被刪除,而造成被包括的子物件被刪除,因為可能還有其它的父物件參考至這個子物件。

我們使用下面這個程式來測試:

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. }

注意由於設定了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多对多怎么实现"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

代码 物件 中介 内容 程式 学习 原始 实用 更深 一方 一端 也就是 使用者 例子 兴趣 只是 多台 实用性 实际 操作简单 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网加科技 深圳市人人互联网科技有限公司 互联网属科技 港股互联网科技股 猪兼强互联网科技 互联网科技公司电话 互联网科技作文 互联网科技排名 互联网科技大会 成都玖崟互联网科技有限公司乐商圈怎么样 中国的互联网科技企业的崛起 金融科技与互联网金融相同和不同 注册互联网科技公司经营范围大全 电子科技大学互联网创业大赛 国大互联网教育科技有限公司工作 互联网新科技动漫ppt素材 元气玛特互联网科技公司是外包吗 美国互联网科技公司 半导体是互联网高科技吗 兰石爱特工业互联网科技分公司 碳银互联网科技 人人互联网科技是培训 无锡溥仪互联网科技有限公司 互联网科技公司需要的职位 阿里巴巴算科技企业还是互联网 中国科技创新与世界互联网大会 乌鲁木齐新华智原互联网科技学校 全球科技与互联网公司市值变化 互联网公司属于科技吗 黑龙江互联网科技公司
0