首页 技术 正文
技术 2022年11月21日
0 收藏 814 点赞 4,041 浏览 3404 个字

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="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该协会的最终不再控制

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,912
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,437
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,252
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,063
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,694
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,732