【SSH三个框架】Hibernate第十篇基础:inverse属性具体解释
2015-08-16 21:15
369 查看
inverse后经常用于双向1—N在相关性。它也可以在使用N—N该协会,这里,例如用双1—N联想
或两个与各部门及工作人员,两javabean没有写。
首先,我们的员工看映射文件:
然后,是部门的映射文件:
此时。在部门的映射文件的set标签中,我们未用inverse属性,接下来我们写一个測试类看看情况:
我们看下程序:首先建立了一个Department对象,并建立了两个Employee对象,而且分别为这两个Employee对象设置depart。
然后,我们建立了一个Set集合存放这两个Employee对象。然后把这个集合注入给Department对象depart。如今。在数据库中是一对多,在Hibernate关系中。部门能够知道有哪些员工,员工知道属于哪个部门。
我们看一下MyEclipse打印出来的sql语句:
我们看到,第一、二、三行是三条插入语句,分别插入1个Department和2个Employee,在第四行打印出来了Department对象拥有的员工的size()个数。可是在最下边两行出现了两条update语句,这两条update语句是我们在代码中把set集合注入给Department对象depart:
当双向1—N关联的时候。1的一端想要维护关系,N的一端也想要维护关系,在1的一端先插入,N的一端后插入之后,还要为N的一端外键再更新成为1的一端的id。所以会多出两条update语句。
可是,假设我们在部门映射文件里的set标签增加inverse="true"的属性后,这两条update语句就会消失。我们改动下部门映射文件:
我们再測试一下会打印出哪些sql语句:
这里的两条update语句已经是不见了。
这是由于1的一端不再控制关联关系。
inverse=“true”演出1该协会的最终不再控制
或两个与各部门及工作人员,两javabean没有写。
首先,我们的员工看映射文件:
<?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="cn.itcast.hibernate.domain"> <class name="Employee" table="tb_Employee"> <id name="id"> <generator class="native"/> </id> <property name="name" /> <many-to-one name="depart" column="depart_id" /> </class> </hibernate-mapping>
然后,是部门的映射文件:
<? 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="cn.itcast.hibernate.domain"> <class name="Department" table="tb_Department"> <id name="id"> <generator class="native"/> </id> <property name="name" /> <set name="emps"> <key column="depart_id" /> <one-to-many class="Employee" /> </set> </class> </hibernate-mapping>
此时。在部门的映射文件的set标签中,我们未用inverse属性,接下来我们写一个測试类看看情况:
package cn.itcast.hibernate; import java.util.HashSet; import java.util.Set; import org.hibernate.Hibernate; import org.hibernate.Session; import org.hibernate.Transaction; import cn.itcast.hibernate.domain.Department; import cn.itcast.hibernate.domain.Employee; public class Many2One { public static void main(String[] arg){ Department depart = add(); } static Department add(){ Session s = null; Transaction tx = null; try{ Department depart = new Department(); Department depart1 = new Department(); depart.setName("depart name"); Employee emp1 = new Employee(); emp1.setDepart(depart); //建立两个对象的关联关系 emp1.setName("emp name"); Employee emp2 = new Employee(); emp2.setDepart(depart); //建立两个对象的关联关系 emp2.setName("emp name"); Set<Employee> emps = new HashSet<Employee>(); emps.add(emp1); emps.add(emp2); depart.setEmps(emps); s = HibernateUtil.getSession(); tx = s.beginTransaction(); s.save(depart); s.save(emp1); s.save(emp2); System.out.println(depart.getEmps().size()); tx.commit(); return depart; }finally{ if(s!=null){ s.close(); } } } }
我们看下程序:首先建立了一个Department对象,并建立了两个Employee对象,而且分别为这两个Employee对象设置depart。
然后,我们建立了一个Set集合存放这两个Employee对象。然后把这个集合注入给Department对象depart。如今。在数据库中是一对多,在Hibernate关系中。部门能够知道有哪些员工,员工知道属于哪个部门。
我们看一下MyEclipse打印出来的sql语句:
Hibernate: insert into tb_Department (name) values (?) Hibernate: insert into tb_Employee (name, depart_id) values (?, ? ) Hibernate: insert into tb_Employee (name, depart_id) values (? , ?) 2 Hibernate: update tb_Employee set depart_id=? where id=? Hibernate: update tb_Employee set depart_id=? where id=?
我们看到,第一、二、三行是三条插入语句,分别插入1个Department和2个Employee,在第四行打印出来了Department对象拥有的员工的size()个数。可是在最下边两行出现了两条update语句,这两条update语句是我们在代码中把set集合注入给Department对象depart:
当双向1—N关联的时候。1的一端想要维护关系,N的一端也想要维护关系,在1的一端先插入,N的一端后插入之后,还要为N的一端外键再更新成为1的一端的id。所以会多出两条update语句。
可是,假设我们在部门映射文件里的set标签增加inverse="true"的属性后,这两条update语句就会消失。我们改动下部门映射文件:
<?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="cn.itcast.hibernate.domain"> <class name="Department" table="tb_Department"> <id name="id"> <generator class="native"/> </id> <property name="name" /> <set name="emps" inverse="true" > <key column="depart_id" /> <one-to-many class="Employee" /> </set> </class> </hibernate-mapping>
我们再測试一下会打印出哪些sql语句:
Hibernate: insert into tb_Department (name) values (?) Hibernate: insert into tb_Employee (name, depart_id) values (?, ? ) Hibernate: insert into tb_Employee (name, depart_id) values (? , ?) 2
这里的两条update语句已经是不见了。
这是由于1的一端不再控制关联关系。
inverse=“true”演出1该协会的最终不再控制
相关文章推荐
- window.open的小技巧分享
- HDU5391——素数筛——Zball in Tina Town
- 增删改查 T-SQL最基本操作
- 打车应用上马快递业务靠谱吗?
- Android webview 缓存总结
- seci-log 1.03 日志分析软增加web日志分析
- mosfet拾遗
- C中柔性数组(flexible array)的学习
- NYOJ 22-素数求和问题
- Qt5的ListView控件使用心得
- 【CF 460C】Present
- Light Bulb 三分入门题
- 判素数+找规律 BestCoder Round #51 (div.2) 1001 Zball in Tina Town
- iPhone手机屏幕的尺寸
- poj1321c语言棋盘简单深搜
- python 点滴记录15:MAC OS安装MySQLdb
- Spring学习笔记-springMVC基于注解的控制器(基本概念)
- Unix 网络编程基础----网络字节序(大端小端)
- java对象引用和值引用,特殊的String!
- 08 条件和循环 - 《Python 核心编程》