• 领域模型:
  • 关系数据模型
  • 双向 n-n 关联须要两端都使用集合属性
  • 双向n-n关联必须使用连接表
  • 集合属性应添加 key 子元素用以映射外键列, 集合元素里还应添加many-to-many子元素关联实体类
  • 在双向 n-n 关联的两边都需指定连接表的表名及外键列的列名. 两个集合元素 set 的table 元素的值必须指定。并且必须同样。set元素的两个子元素:key 和 many-to-many 都必须指定 column 属性。当中,key 和 many-to-many 分别指定本持久化类和关联类在连接表中的外键列名,因此两边的 key 与 many-to-many 的column属性交叉同样。也就是说。一边的set元素的key的 cloumn值为a,many-to-many 的 column 为b。则还有一边的 set 元素的 key 的 column 值 b,many-to-many的 column 值为 a.
  • 对于双向 n-n 关联, 必须把当中一端的 inverse 设置为 true, 否则两端都维护关联关系可能会造成主键冲突.
代码具体解释:
Category.java
package com.atguigu.hibernate.n2n;import java.util.HashSet;
import java.util.Set;public class Category {private Integer id;private String name;private Set<Item> items = new HashSet<>();public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<Item> getItems() {return items;}public void setItems(Set<Item> items) {this.items = items;}}

Item.java

package com.atguigu.hibernate.n2n;import java.util.HashSet;
import java.util.Set;public class Item {private Integer id;private String name;private Set<Category> categories = new HashSet<>();public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<Category> getCategories() {return categories;}public void setCategories(Set<Category> categories) {this.categories = categories;}}

Category.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="com.atguigu.hibernate.n2n"> <class name="Category" table="CATEGORIES"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="native" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <!-- table: 指定中间表 --> <set name="items" table="CATEGORIES_ITEMS"> <key> <column name="C_ID" /> </key> <!-- 使用 many-to-many 指定多对多的关联关系. column 运行 Set 集合中的持久化类在中间表的外键列的名称 --> <many-to-many class="Item" column="I_ID"></many-to-many> </set> </class> </hibernate-mapping>

Item.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="com.atguigu.hibernate.n2n.Item" table="ITEMS"><id name="id" type="java.lang.Integer"><column name="ID" /><generator class="native" /></id><property name="name" type="java.lang.String"><column name="NAME" /></property><set name="categories" table="CATEGORIES_ITEMS" inverse="true"><key column="I_ID"></key><many-to-many class="com.atguigu.hibernate.n2n.Category" column="C_ID"></many-to-many></set></class>
</hibernate-mapping>

package com.atguigu.hibernate.n2n;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;
import java.util.Set;import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.jdbc.Work;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;public class HibernateTest {private SessionFactory sessionFactory;private Session session;private Transaction transaction;@Beforepublic void init(){Configuration configuration = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();sessionFactory = configuration.buildSessionFactory(serviceRegistry);session = sessionFactory.openSession();transaction = session.beginTransaction();}@Afterpublic void destroy(){transaction.commit();session.close();sessionFactory.close();}@Testpublic void testGet(){Category category = (Category) session.get(Category.class, 1);System.out.println(category.getName()); //须要连接中间表Set<Item> items = category.getItems();System.out.println(items.size()); }@Testpublic void testSave(){Category category1 = new Category();category1.setName("C-AA");Category category2 = new Category();category2.setName("C-BB");Item item1 = new Item();item1.setName("I-AA");Item item2 = new Item();item2.setName("I-BB");//设定关联关系category1.getItems().add(item1);category1.getItems().add(item2);category2.getItems().add(item1);category2.getItems().add(item2);item1.getCategories().add(category1);item1.getCategories().add(category2);item2.getCategories().add(category1);item2.getCategories().add(category2);//运行保存操作session.save(category1);session.save(category2);session.save(item1);session.save(item2);}}

版权声明:本文博主原创文章。博客,未经同意,不得转载。

hibernate 双向n-n相关推荐

  1. Hibernate 双向一对一实现(基于annotation)

    1.基于(foreign key)外键实现 国家<-------->首都 Country.java 1 package hibernate.orm.one2one.fk; 2 3 impo ...

  2. Hibernate双向多对多关联

    一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project {//编号private ...

  3. hibernate 双向一对多 关联在多端维护

    作者:xyzroundo 如果在"一"一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多  的一端来维护关联关系

  4. 解决hibernate双向关系造成的一方重复执行SQl,或者死循环的问题

    系统采用struts-json hibernate3. 在对关联表配置manytoone onetomany双向关联的时候,在执行一方的时候,会发现打印出来的SQL语句多执行了一次或者多次.经过调试, ...

  5. Hibernate双向一对一对象关系模型映射

    一个员工一辆车:one-to-one 实现一:让汽车表中的外键唯一 1 create table emp 2 ( 3 eid int primary key auto_increment, 4 ena ...

  6. Hibernate关联关系映射-----双向一对多/多对一映射配置

    转自:http://blog.csdn.net/yifei12315/article/details/6985194 /// Hibernate: /// 双向关联就是有"一对多" ...

  7. Hibernate 多对多的增删改查。

    inverse Hibernate 多对多的增删改查你得先了解inverse功能作用. 百度文档: Inverse是hibernate双向关系中的基本概念.inverse的真正作用就是指定由哪一方来维 ...

  8. Hibernate一对多/多对一关系映射详解及相应的增删查改操作

    以客户与订单的关系为例 1.在实体模型类中绑定两者关系: 客户类: public class Customer {private Integer id;//客户idprivate String nam ...

  9. hibernate_2

    表与表之间的关系回顾 1 一对多 (1)分类和商品关系,一个分类里面有多个商品,一个商品只能属于一个分类 (2)客户和联系人是一对多关系 - 客户:与公司有业务往来,百度.新浪.360 - 联系人:公 ...

最新文章

  1. AMD猛攻数据中心市场,拿下15年来最高份额,英特尔DCG收入下滑20%
  2. linux shell 删除两个文件相同部分
  3. c++ 定时器_【话说定时器系列】之十:PWM输入模式测量脉宽及占空比实验
  4. IDEA Error:java: Compilation failed: internal java compiler error
  5. C++使用数组实现stack堆栈(附完整源码)
  6. php7 加的新特性积累
  7. PostgreSQL学习笔记7之函数和操作符三
  8. day3-文件操作之基本操作
  9. 集合Collection总览
  10. Java线程类核心方法
  11. 逆向路由器固件之敏感信息泄露 Part2
  12. C#基础知识之读取xlsx文件Excel2007
  13. 二十五、JAVA多线程(一、理论知识)
  14. win10 更新 英特尔显示器音频 后显示器音箱没有声音
  15. CSDN没有C币如何下载文章?
  16. Android 屏幕万能自适应(自定义适配)
  17. GNS3安装图文教程
  18. [No000003]现代版三十六计,计计教你如何做人
  19. 7、51单片机——74HC595、74HC573、字模和点阵屏详解
  20. mysql 1032错误_修复mysql slave复制1032错误

热门文章

  1. 两步实现 mysql 远程连接
  2. 13款基于jQuery Mobile的布局插件和示例
  3. 使用JavaScript实现一个简单的编译器
  4. 《代码敲不队》第五次作业:项目需求分析改进与系统设计
  5. windows安装oracle11g
  6. WS-Addressing 了解
  7. ubuntu LAMP安装
  8. 安装phpredis扩展
  9. [原创]使用 NodeJS, MarkdownJS, PrettifyJS 打造个人博客写作平台 - 整体思路
  10. C#中的代理(delegate)[转载]