hibernate 双向n-n
- 领域模型:
- 关系数据模型
- 双向 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, 否则两端都维护关联关系可能会造成主键冲突.
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相关推荐
- Hibernate 双向一对一实现(基于annotation)
1.基于(foreign key)外键实现 国家<-------->首都 Country.java 1 package hibernate.orm.one2one.fk; 2 3 impo ...
- Hibernate双向多对多关联
一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project {//编号private ...
- hibernate 双向一对多 关联在多端维护
作者:xyzroundo 如果在"一"一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多 的一端来维护关联关系
- 解决hibernate双向关系造成的一方重复执行SQl,或者死循环的问题
系统采用struts-json hibernate3. 在对关联表配置manytoone onetomany双向关联的时候,在执行一方的时候,会发现打印出来的SQL语句多执行了一次或者多次.经过调试, ...
- Hibernate双向一对一对象关系模型映射
一个员工一辆车:one-to-one 实现一:让汽车表中的外键唯一 1 create table emp 2 ( 3 eid int primary key auto_increment, 4 ena ...
- Hibernate关联关系映射-----双向一对多/多对一映射配置
转自:http://blog.csdn.net/yifei12315/article/details/6985194 /// Hibernate: /// 双向关联就是有"一对多" ...
- Hibernate 多对多的增删改查。
inverse Hibernate 多对多的增删改查你得先了解inverse功能作用. 百度文档: Inverse是hibernate双向关系中的基本概念.inverse的真正作用就是指定由哪一方来维 ...
- Hibernate一对多/多对一关系映射详解及相应的增删查改操作
以客户与订单的关系为例 1.在实体模型类中绑定两者关系: 客户类: public class Customer {private Integer id;//客户idprivate String nam ...
- hibernate_2
表与表之间的关系回顾 1 一对多 (1)分类和商品关系,一个分类里面有多个商品,一个商品只能属于一个分类 (2)客户和联系人是一对多关系 - 客户:与公司有业务往来,百度.新浪.360 - 联系人:公 ...
最新文章
- AMD猛攻数据中心市场,拿下15年来最高份额,英特尔DCG收入下滑20%
- linux shell 删除两个文件相同部分
- c++ 定时器_【话说定时器系列】之十:PWM输入模式测量脉宽及占空比实验
- IDEA Error:java: Compilation failed: internal java compiler error
- C++使用数组实现stack堆栈(附完整源码)
- php7 加的新特性积累
- PostgreSQL学习笔记7之函数和操作符三
- day3-文件操作之基本操作
- 集合Collection总览
- Java线程类核心方法
- 逆向路由器固件之敏感信息泄露 Part2
- C#基础知识之读取xlsx文件Excel2007
- 二十五、JAVA多线程(一、理论知识)
- win10 更新 英特尔显示器音频 后显示器音箱没有声音
- CSDN没有C币如何下载文章?
- Android 屏幕万能自适应(自定义适配)
- GNS3安装图文教程
- [No000003]现代版三十六计,计计教你如何做人
- 7、51单片机——74HC595、74HC573、字模和点阵屏详解
- mysql 1032错误_修复mysql slave复制1032错误