Hibernate一对多映射配置
2016-04-21 15:50
232 查看
PS、inverse与cascade区别
1、inverse表示是否反转控制,默认为false,表示不反转,由本类控制
表现为一方添加时,由inverse="false"的类修改外键列。
(执行update语句)
(1)一对多时,一方类集合设inverse="false"(即默认),多方类many-to-one不可设置,默认为true
表示设置多方表中外键列的值。
(2)多对多时,根据业务需求设其中一多方为false,另一方需为true,即只由false方添加外键关联于第三方表,true方不修改以避免添加重复报错。
表示在中间表中插入或删除记录。
2、cascade表示级联,默认为none,可设置为save-update,delete,all(即包括save-update以及delete)等
当设置了cascade不为none的一方,添加、修改、删除类中包含集合时,会同步添加、修改、删除集合代表类(一对多)或第三方表(多对多)的
对应关系。
(执行delete、insert语句)
一、构建实体类
构建Deparment类作为一方
//get、set方法@Overridepublic String toString() {return "Department [id=" + id + ", name=" + name + ", employees=" + employees + "]";}}
构建Employee类作为多方
构建Department.hbm.xml映射文件
(1)、name:一方中保存多方的集合属性名
(2)、inverse:设为false(默认),表示维护关系
(3)、table:构建的第三方关系表名,适用于多对多,不需配置
2、<key><column/></key>
(1)、name:多方类对应的表中,表示本类的列名(外键列名)
(2)、class:多方实体类名(全类名)
1、<many-to-one>
(1)、name:多方实体类中,保存对应一方实体的属性名
(2)、class:一方实体类名(类全名)
2、<column>
(1)、name:表中关联一方表的外键列名
与一方中的<key><column name=""/></key>相同
二、构建测试类
1、未设置casecade时,要同时保存一方及多方。且先保存一方(department),再保存多方(employee)。
2、set的inverse设为true(many-to-one锁定为false),双方都不维护,所以保存多方前要先关联一方。
PS、
3、 Hibernate先执行所有insert语句,在事务提交时再根据inverse修改外键列
4、set的inverse为flase,同时保存一、多方时:
(1) 先保存多方时,一方还未保存,无法关联外键列,所以先设外键列为null,再执行修改
update 多方表 set 其他属性=?, 外键列=? where id=?
而后一方表重复修改外键列 update 多方表 set 外键列=? where id=?
(2)先保存一方时,插入后只修改一次外键列 update 多方表 set 外键列=? where id=?
1、inverse表示是否反转控制,默认为false,表示不反转,由本类控制
表现为一方添加时,由inverse="false"的类修改外键列。
(执行update语句)
(1)一对多时,一方类集合设inverse="false"(即默认),多方类many-to-one不可设置,默认为true
表示设置多方表中外键列的值。
(2)多对多时,根据业务需求设其中一多方为false,另一方需为true,即只由false方添加外键关联于第三方表,true方不修改以避免添加重复报错。
表示在中间表中插入或删除记录。
2、cascade表示级联,默认为none,可设置为save-update,delete,all(即包括save-update以及delete)等
当设置了cascade不为none的一方,添加、修改、删除类中包含集合时,会同步添加、修改、删除集合代表类(一对多)或第三方表(多对多)的
对应关系。
(执行delete、insert语句)
一、构建实体类
构建Deparment类作为一方
public class Department { private Integer id; private String name;
<pre name="code" class="java" style="font-size: 13.3333px;"> //保存包含的多个多方private Set<Employee> employees = new HashSet<Employee>();//初始化Set集合,方便添加元素
//get、set方法@Overridepublic String toString() {return "Department [id=" + id + ", name=" + name + ", employees=" + employees + "]";}}
构建Employee类作为多方
public class Employee { private Integer id; private String name; private Department department;
//get、set方法 @Override public String toString() { return "Employee [id=" + id + ", name=" + name + ", department=" + department + "]"; } }
构建Department.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"> <!-- Generated 2016-4-20 0:24:37 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping package="entity"> <class name="Department" table="DEPARTMENT"> <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="employees" inverse="false"> <key> <column name="DEPARTMENTID" /> </key> <one-to-many class="Employee" /> </set> </class> </hibernate-mapping>1、<set> 一方
(1)、name:一方中保存多方的集合属性名
(2)、inverse:设为false(默认),表示维护关系
(3)、table:构建的第三方关系表名,适用于多对多,不需配置
2、<key><column/></key>
(1)、name:多方类对应的表中,表示本类的列名(外键列名)
(2)、class:多方实体类名(全类名)
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2016-4-20 0:24:37 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping package="entity"> <class name="Employee" table="EMPLOYEE"> <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> <many-to-one name="department" class="Department" > <column name="DEPARTMENTID" /> </many-to-one> </class> </hibernate-mapping>
1、<many-to-one>
(1)、name:多方实体类中,保存对应一方实体的属性名
(2)、class:一方实体类名(类全名)
2、<column>
(1)、name:表中关联一方表的外键列名
与一方中的<key><column name=""/></key>相同
二、构建测试类
@Test public void testSave() { Session session = DBManager.getSessionFactory().openSession(); Transaction tx = null; try { tx = session.beginTransaction(); Employee employee1 = new Employee(); employee1.setName("A"); Employee employee2 = new Employee(); employee2.setName("B"); Department department = new Department(); department.setName("Dept"); employee1.setDepartment(department); employee2.setDepartment(department); department.getEmployees().add(employee1); department.getEmployees().add(employee2); session.save(department); session.save(employee1); session.save(employee2); tx.commit(); } catch (HibernateException e) { tx.rollback(); e.printStackTrace(); } finally{ session.close(); } }
1、未设置casecade时,要同时保存一方及多方。且先保存一方(department),再保存多方(employee)。
2、set的inverse设为true(many-to-one锁定为false),双方都不维护,所以保存多方前要先关联一方。
PS、
3、 Hibernate先执行所有insert语句,在事务提交时再根据inverse修改外键列
4、set的inverse为flase,同时保存一、多方时:
(1) 先保存多方时,一方还未保存,无法关联外键列,所以先设外键列为null,再执行修改
update 多方表 set 其他属性=?, 外键列=? where id=?
而后一方表重复修改外键列 update 多方表 set 外键列=? where id=?
(2)先保存一方时,插入后只修改一次外键列 update 多方表 set 外键列=? where id=?
相关文章推荐
- Notepad++连接QQ浏览器
- TomCat的工作原理和端口理解
- 06-图2 Saving James Bond - Easy Version (25分)
- 输出js对象的所有属性值
- Google code: Why 'Everything up-to-date' when pushing (git)
- 搭建一个免费的,无限流量的 Blog ---- github Pages 和 Jekyll 入门
- bzoj 3209: 花神的数论题 数位dp
- MVC的应该干啥事
- 在Naoqi中使用OpenCV
- JS原型链原理(链表)
- 编写Linux脚本
- Maven入门-1.介绍及搭建开发环境
- 进程数据共享
- IT项目管理痛点和应对方法总结
- java基础知识
- C++中赋值函数和拷贝构造函数(举例说明)
- Game of Life
- 欧氏距离与余弦相似度
- 桶排序_改进结构体
- Unity之Assetbundle打包记录一