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中 ...
随机推荐
- thymeleaf错误 org.xml.sax.SAXParseException: 在实体引用中, 实体名称必须紧跟在 ‘&’ 后面
在thymeleaf的js中使用&,<,>等符号时会产生这种问题,因为thymeleaf是采用xml解析的方式进行替换的,所以javascript中&这样的xml实体转义字 ...
- vue中 请求拦截 响应拦截设置
第一,在项目的src中新建http.js文件,将以下代码复制进去 import axios from 'axios' import { Message, Loading } from 'element ...
- [人物存档]【AI少女】【捏脸数据】时尚
点击下载(城通网盘):3in1.zip 点击下载(城通网盘):存档.zip
- [Python之路] 闭包
一.思考一个问题 我们要给定一个x,要求一条直线上x对应的y的值.公式是y = kx+b. 我们需要用k,b来确定这条直线,则我们实现的函数应该有3个参数: def line(k, b, x): pr ...
- 51 Nod 1163 最高的奖励
1163 最高的奖励 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励.在结束时间之前完成 ...
- hdu 5810 Balls and Boxes 二项分布
Balls and Boxes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 8.JavaScript
1.JavaScript简介 JavaScript主要运行在客户端,用户访问带有JavaScript的网页,网页里的JavaScript程序就会传给浏览器,由浏览器解释和处理.表单数据的有效性验证等互 ...
- 2019牛客暑期多校训练营(第一场)H 线性基+计算贡献
题意 给n个整数,求满足子集异或和为0的子集大小之和. 分析 将问题转化为求每个元素的贡献次数之和. 先对n个数求线性基,设线性基大小为r,即插入线性基的数字个数为r,可以分别计算线性基内数的贡献和线 ...
- MySQL的安装教程
一.MYSQL的安装 首先登入官网下载mysql的安装包,官网地址:https://dev.mysql.com/downloads/mysql/ 一般下载这个就好,现在的最新版本是5.8,但是据说已经 ...
- C++入门经典-例6.21-比较string字符串,比较两个字符串
1:使用“>”.“!=”.“>=”等比较运算符可以比较两个字符串的内容.比较的方法是将两个string字符串从头开始比较每一个字符,直到出现两者不一致.比较这两个不相同的字符的字面值,得出 ...