hibernate之inverse=true相关配置讲解
首先inverse=”true”是在双向关联里面使用单向关联没有这个配置
inverse – 标记由哪一方来维护关联关系(双向关联中会用到)
inverse默认值为false
如果inverse设置为true,表示将由对方维护两者之间的关联关系
举例说明
OR映射文件
contactPerson映射文件
<class name="cn.com.leadfar.hibernate.ContactPerson" table="t_person" >
<id name="id">
<generator class="native"/>
</id>
<property name="name" />
<property name="address"/>
<property name="qq" />
<!-- 多对一这端gid要和一一端保持一致 如果不保持一致 指向group的一种引用-->
<many-to-one name="group" column="gid1"></many-to-one>
</class>
Group的相关配置文件
<class name="cn.com.leadfar.hibernate.Group" table="t_group" >
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- 没有设置inverse=true表示任意一端管理都可以 -->
<!-- 设置inverse=true标识强制一的一端管理他们的关联关系 默认是inverse=false的情况双方都可以管理关联关系 -->
<set name="persons" lazy="extra" >
<!-- 要跟多的一端gid保持一致 -->
<key column="gid2"></key>
<one-to-many class="cn.com.leadfar.hibernate.ContactPerson"/>
</set>
</class>
<set name="students“ lazy=“false” inverse=“true”>
<key column="classesid" ></key>
<one-to-many class=“cn.com.leadfar.Student" />
</set>
强制规定在对方去联双方的联关系
Inverse=”false”表示双方都可以管理这个关联关系(缺省情况下)
配置文件
当Inverse=”false”示例
代码:
session.beginTransaction();
ContactPerson cp1 = new ContactPerson("炉小鱼");
session.save(cp1);
ContactPerson cp2 = new ContactPerson("比尔盖茨");
session.save(cp2);
ContactPerson cp3 = new ContactPerson("巴菲特");
session.save(cp3);
Group g1 =new Group("组0");
session.save(g1);
Group g2 = new Group("组1");
session.save(g2);
Group g3 = new Group("组3");
session.save(g3);
Set<ContactPerson> persons1 = new HashSet<ContactPerson>();
persons1.add(cp1);
persons1.add(cp2);
g1.setPersons(persons1);
Set<ContactPerson> persons2 = new HashSet<ContactPerson>();
persons2.add(cp3);
g3.setPersons(persons2);
session.getTransaction().commit();
输出

由一的一端进行维护所有gid1就是null
//**************从多的一端和一的一端进行双向管理他们的关联关系****************************
session.beginTransaction();
ContactPerson cp1 = new ContactPerson("炉小鱼");
session.save(cp1);
ContactPerson cp2 = new ContactPerson("比尔盖茨");
session.save(cp2);
ContactPerson cp3 = new ContactPerson("巴菲特");
session.save(cp3);
Group g1 =new Group("组0");
g1.addPerson(cp1);
g1.addPerson(cp2);
session.save(g1);//g1变成了持久化对象状态,现在拥有了数据库标识
//还要建立
cp1.setGroup(g1);
cp2.setGroup(g1);
Group g2 = new Group("组1");
session.save(g2);////g2变成了持久化对象状态,现在拥有了数据库标识
Group g3 = new Group("组3");
g3.addPerson(cp3);
session.save(g3);////g3变成了持久化对象状态,现在拥有了数据库标识
cp3.setGroup(g3);
session.getTransaction().commit();
输出

从一的一端去管理他们的关联关系
//*****************从一的一端去关联他们的关联关系***************************
Group g1 = new Group("组0");
session.save(g1);
Group g2 = new Group("组1");
session.save(g2);
Group g3 = new Group("组3");
session.save(g3);
ContactPerson cp1 = new ContactPerson("炉小雨");
cp1.setGroup(g1);//建立关联关系
session.save(cp1);
ContactPerson cp2 = new ContactPerson("比尔盖茨");
cp2.setGroup(g1);//建立关联关系
session.save(cp2);
ContactPerson cp3 = new ContactPerson("巴菲特");
cp3.setGroup(g3);//建立关联关系
session.save(cp3);
输出

以上就是inverse=”false”的情况下在多的一端和一的一端都可以管理他们的关联关系
跟着给一的一端设置inverse=true
<class name="cn.com.leadfar.hibernate.Group" table="t_group" >
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- 没有设置inverse=true表示任意一端管理都可以 -->
<set name="persons" lazy="extra" inverse="true" >
<!-- 要跟多的一端gid保持一致 -->
<key column="gid2"></key>
<one-to-many class="cn.com.leadfar.hibernate.ContactPerson"/>
</set>
</class>
继续运行从多的一端运行的管理测试代码
我们分析这段代码
g1.addPerson(cp1); //如果在一的一端设置了inverse=true,那么这段代码就没有用了
g1.addPerson(cp2); //如果在一的一端设置了inverse=true,那么这段代码就没有用了,所以gid字段就为null了
cp1.setGroup(g1);//多的一端管理会起作用
cp2.setGroup(g1);//多的一端管理会起作用
只有这种方式的关联才会是gid1有值
这就是inverse=-true带给我们一个直观的结果,设置inverse=true他将不再由一的一端去管理一和多之间的关联关系
Inverse=true 作用
刚才字段设置成两个是为了看的更清楚 设置了inverse=true表示哪个字段有值哪个字段没有值会看的更清楚 如果你设置了inverset=true表示强制在哪一端管理他们的关联关系 一般要设置字段保持一致
<class name="cn.com.leadfar.hibernate.ContactPerson" table="t_person" >
<id name="id">
<generator class="native"/>
</id>
<property name="name" />
<property name="address"/>
<property name="qq" />
<!-- 多对一这端gid要和一一端保持一致 如果不保持一致 指向group的一种引用-->
<many-to-one name="group" column="gid"></many-to-one>
</class>
<class name="cn.com.leadfar.hibernate.Group" table="t_group" >
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- 没有设置inverse=true表示任意一端管理都可以 -->
<!-- 设置inverse=true标识强制一的一端管理他们的关联关系 -->
<set name="persons" lazy="extra" inverse="true" >
<!-- 要跟多的一端gid保持一致 -->
<key column="gid"></key>
<one-to-many class="cn.com.leadfar.hibernate.ContactPerson"/>
</set>
</class>
//没有设置inverse="true"那么在更新一的一端的数据时
Group g = (Group) session.load(Group.class, 1);
System.out.println(g.getName());
g.setName("好朋友");
session.getTransaction().commit();
在多层应用架构里面 如果要更新一个对象 首先是要根据id查询出来,将id对象显示在更新界面里面 最后在提交到更新的action里面,说这个的意思是通常更新不是这样去更新的 提交到后台的更新action里面要new 模型 里面赋予相关的id值以及相关的属性用这种方式来更新更加常见
ContactPerson cp1 = new ContactPerson();
cp1.setId(1);
cp1.setName("helloworld");
cp1.setAddress("平川");
cp1.setQq("3333222");
//这时更新gid会为null
session.update(cp1);
session.getTransaction().commit();
输出:
session.beginTransaction();
ContactPerson cp1 = new ContactPerson();
cp1.setId(1);
cp1.setName("helloworld");
cp1.setAddress("平川");
cp1.setQq("3333222");
//这时更新gid会为null
//我们得记住他的关联
Group g1 = new Group();
g1.setId(1);
cp1.setGroup(g1);
session.update(cp1);
输出
session.beginTransaction();
Group g1 = new Group();
g1.setId(1);
g1.setName("朋友");
session.update(g1);
我很不希望这种情况发生,我们发现关联丢失了如果这个关联想要不丢失怎么办呢?
最简单的方式就是设置inverse=true
设置inverse=true的结果后
session.beginTransaction();
Group g1 = new Group();
g1.setId(1);
g1.setName("sb34朋友");
ContactPerson cp1 = new ContactPerson();
cp1.setId(1);
ContactPerson cp2 = new ContactPerson();
cp2.setId(2);
g1.addPerson(cp1);
g1.addPerson(cp2);
session.update(g1);
session.getTransaction().commit();
发现集合里面保存的东西我们是不管他的,所以inverse=true不管在这个集合里面有没有数据
public class Group {
private int id;
private String name;
private Set<ContactPerson> persons = new HashSet<ContactPerson>();
在保存和更新的时候都不会去同步集合里面的数据就当集合里面的数据不存在不管又还是没有我都不管
hibernate之inverse=true相关配置讲解的更多相关文章
- Hibernate中inverse="true"的理解
Hibernate中inverse="true"的理解 举例如下 转自:http://lijiejava.iteye.com/blog/776587 Customer类: publ ...
- Nginx服务器抵御CC攻击的相关配置讲解
CC攻击利用代理服务器向网站发送大量需要较长计算时间的URL请求,如数据库查询等,导致服务器进行大量计算而很快达到自身的处理能力而形成DOS.而攻击者一旦发送请求给代理后就主动断开连接,因??代理并不 ...
- 由hibernate配置inverse="true"而导致的软件错误,并分析解决此问题的过程
题目背景软件是用来做安装部署的工具,在部署一套系统时会有很多安装包,通过此工具,可以生成一个xml文件用以保存每个安装包的文件位置.顺序.参数.所需脚本.依赖条件验证(OS..net.IIS.数据版本 ...
- Hibernate的配置中,c3p0连接池相关配置
一.配置c3p0 1.导入 hibernate-c3po连接池包,Maven地址是:http://mvnrepository.com/artifact/org.hibernate/hibernate- ...
- Hibernate逍遥游记-第13章 映射实体关联关系-004双向多对多(inverse="true")
1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hi ...
- Hibernate日常应用的相关问题
1.在控制台中显示Hibernate打印的SQL中的参数 默认情况下,hibernate的sql中都是以问号代表参数,并没有显示参数的真实值,但是也不是做不到,只需要两步配置就可以显示出参数的真实值了 ...
- Hibernate【inverse和cascade属性】知识要点
Inverse属性 Inverse属性:表示控制权是否转移.. true:控制权已转移[当前一方没有控制权] false:控制权没有转移[当前一方有控制权] Inverse属性,是在维护关联关系的时候 ...
- hibernate+mysql的连接池配置
1:连接池的必知概念 首先,我们还是老套的讲讲连接池的基本概念,概念理解清楚了,我们也知道后面是怎么回事了. 以前我们程序连接数据库的时候,每一次连接数据库都要一个连接,用完后再释放.如果频繁的 ...
- C3P0连接池在hibernate和spring中的配置
首先为什么要使用连接池及为什么要选择C3P0连接池,这里就不多说了,目前C3P0连接池还是比较方便.比较稳定的连接池,能与spring.hibernate等开源框架进行整合. 一.hibernate中 ...
随机推荐
- MyBatis-04-配置解析
4.配置解析 1.核心配置文件 mybatis-config.xml MyBatis的配置文件包含了会深深影响MyBatis行为的设置和属性信息 configuration(配置) propertie ...
- php类知识---最疯狂的魔术方法serialize,_sleep,__wakeup,unserialize,__autoload,__clone
serialize-----把实例化的对象写入文件 __sleep 调用serialize时触发 <?php class mycoach { public function __construc ...
- shell通配符
wildcard 通配服 匹配.c文件 *.sh----常看当前目录下sh文件 *.c----常看当前目录下c文件 []---表示中括号 e.g [0,1,2,3,4]----能匹配0,1,2,3 ...
- linux中强大的编辑工具vim
先来个图镇贴 vim是一个模式编辑器.由三种主要模式比较常用: 1.命令(Normal)模式:默认模式,移动光标,剪切/粘贴文本 2.插入(Insert)或编辑模式:修改文本 3.扩展命令(exten ...
- java多线程批量下载文件
多线程下载文件 平时开发中有时会用到文件下载,为了提高文件的下载速率,采用多线程下载能够达到事半功倍的效果: package test; /** * 文件下载类 * @author luweichen ...
- UVA 315 求割点 模板 Tarjan
D - D Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Pract ...
- Spring——顾问封装通知
通知(advice)是Spring中的一种比较简单的切面,只能将切面织入到目标类的所有方法中,而无法对指定方法进行增强 顾问(advisor)是Spring提供的另外一种切面,可以织入到指定的方法中 ...
- 推荐系统系列(四):PNN理论与实践
背景 上一篇文章介绍了FNN [2],在FM的基础上引入了DNN对特征进行高阶组合提高模型表现.但FNN并不是完美的,针对FNN的缺点上交与UCL于2016年联合提出一种新的改进模型PNN(Produ ...
- 使用matplotlib绘制常用图表(3)-其他图表绘制
一.绘制三点图 """ 三月份最高气温 a = [12,15,18,6,7,5,6,8,9,10,15,10,4,5,11,10,5,6,12,15,10,5,14,10 ...
- spring cloud stream整合
spring cloud stream整体架构核心概念图: 图一:消息的发送端和接收端可以是不同的中间件 图二: 图三:在消息的发送之前和消息的接收端套了一层管道 @Output:输出注释,用于定义发 ...