博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【SSH三个框架】Hibernate第十篇基础:inverse属性具体解释
阅读量:6991 次
发布时间:2019-06-27

本文共 3643 字,大约阅读时间需要 12 分钟。

inverse后经常用于双向1—N在相关性。它也可以在使用N—N该协会,这里,例如用双1—N联想

或两个与各部门及工作人员,两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="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
emps = new HashSet
(); 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语句就会消失。我们改动下部门映射文件:

我们再測试一下会打印出哪些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该协会的最终不再控制

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

你可能感兴趣的文章
[LeetCode] Surrounded Regions, Solution
查看>>
MySQL系列:数据库基本操作(1)
查看>>
hdu1058(dp)
查看>>
android EditText与TextView几个常用的属性
查看>>
SDN第五次上机作业
查看>>
课堂练习
查看>>
Git 工具 - 储藏(Stashing)
查看>>
越狱(快速幂)
查看>>
联合查询的 SQL 语法
查看>>
Python语法
查看>>
服务器使用bbr加速配置
查看>>
Hadoop综合大作业
查看>>
JAVA 消耗 CPU过高排查方法
查看>>
DOM和BOM
查看>>
prometheus监控示例
查看>>
细菌的繁殖
查看>>
Windows Server 2008远程连接人数限制修改及修改端口
查看>>
第70天:jQuery基本选择器(一)
查看>>
目前微信 微博 新浪 豆瓣等所有分享的js插件
查看>>
源码包安装
查看>>