在hibernate中一对多关联时会经常用到inverse和cascade属性

2023-11-20 22:58

本文主要是介绍在hibernate中一对多关联时会经常用到inverse和cascade属性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 原文网址:http://hi.baidu.com/icehua521/blog/item/eb6b5099a98271006e068cbf.html

在hibernate中一对多关联时会经常用到inverse和cascade属性 ,
inverse 有两个值 true ,false,默认值是false   ;如果设置为true 则表示对象的状态变化不会同步到数据库 ;设置false就相反拉;
cascade 有五个选项 分别是: all ,delete ,none,save-update,delete-orphan ;
       all : 所有情况下均进行关联操作。
       none:所有情况下均不进行关联操作。这是默认值。
       save-update:在执行save/update/saveOrUpdate时进行关联操作。
       delete:在执行delete时进行关联操作。
       delete-orphan: 当save/update/saveOrUpdate时,相当于save-update ;当删除操作时,相当于delete ;


对象关联关系有一对一,多对一,一对多和多对多,其中多对一和一对多关系比较常见。一对一有两种方式:以主键关联和以外键关联。一对多和多对一通常应设置为双向关联,并在“一”这一方设置inverse="true" (比如一个班级对就多个学生,在班级这一边设置inverse="true")。多对多需要第三张表来保存两个实体之间的关系。

Hibernate检索策略有立即检索、延迟检索、预先抓取、批量立即检索、批量预先检索。对于末端为“一”(一对一和多对一)的关联,一般设置为预先抓取,对于末端为“多”(一对多和多对多)的关联,一般设置为延迟检索。

按照检索策略的优先权,按从大到小排序如下:HQL>预先抓取>立即或延迟。HQL语句将忽略第一层的预先抓取,但延迟检索的配置对HQL的检索仍有影响;附属层始终采取配置文件的检索策略。

在多对多的关系需要配置的属性比较多一点,初学者经常会把<key column="">和<column="">的值弄反,其实只要记住一个原则就不会弄错了,这个原则是:<key column="">总是和本身类的主键id对应,而<column="">总是与关联类的id相对应。

一对一比较简单,因为没有column属性,所以不会引起混淆,两个关联的类以主键相关联。一对多需要指定自己的主键值和关联类的哪一个列相对应,所以要设置<key column="">。多对一关系中,“多”这一边在对应的数据表中需要增加一个字段来保存关系,这个字段存放和关联类(也就是“一”那一端)的主键id相同的值,也可以设为外键引用。多对多关联中,两个实体类需要告诉辅助表:“你这个表中哪个字段是我的主键,哪 个字段是我所关联的类的主键”,因此<key column="">和<column="">都要设置。

双向关联中一定要注意inverse的使用,设置了inverse="true"这一端比较清闲,它把控制权交给了另一端。一对多应该让“多”这一端有控制权,也就是在一这一端设置inverse="true"。

多对多关系中不可以把cascade设为all或delete,比如删除一个学生,不应该级联删除他所选择的课程的记录,因为这些课程可能还被其他学生所选择了。

 

hibernate中一对多多对一关系设计的理解

1、单向多对一和双向多对一的区别?

只需要从一方获取另一方的数据时 就使用单向关联
双方都需要获取对方数据时 就使用双向关系

部门--人员

使用人员时
如果只需要获取对应部门信息(user.getdeptarment())
不需要 从部门下的人员信息时,就配置成单向 多对一

使用部门时
如果只需要获取部门下人员信息(deptartmanet.getusers())
不需要 从人员获取部门信息时,就配置成单向 一对多

既要获取部门下人员 deptartmanet.getusers()
又要从人员获取部门信息 user.getdeptarment()

那就 配置成双向一对多,也就是双向多一

看需求来配置了。


2、策略
关联关系的本质是将关联关系映射到数据库中。关联关系在对象模型中体现为内存中的一个或多个引用。  一对多关系:一对多关系 分为单向一对多/多对一关系双向多对一关系。
   • 单向一对多/多对一关系只需在方进行配置,
   • 双向多对一关系需要在关联双方均加以配置。双向多对一关联就是在多方和一方都进行配置,并在 方通过属性inverse="true"设置控制关系反转
    注:单向多对一关联是最常见的单向关联关系。
    注:双向多对一关联是最常见的双向关联关系。双向多对一关联实际上是多对
一对多关联的组合。
 
多对一及一对多关联映射的区别(单向):
不管多对一还是一对多,都是在""的一端添加一个外键指向""的一端,只不过是多对一是在多的一端为其自己添外键,而一对多则是在一的一端为多的一端添加外主键。
 
 
模型:一个用户组(group)对应多个用户(user)。
 
多对一关联映射:是在""的一端添加一个外键指向""的一端,它维护的关系为多到一的关系,如:当载入一个用户(user)时将会同时载入组(group)的信息。它的关系映射将写在多的一端(user):    
 <many-to-one name="group" column="relatedGroup" cascade="all" />    此时它在多的一端(user)添加了一个外键relateGroup指向一的一端。在多的一端通过group维护一的一端。
 
一对多关联映射:是在""的一端为多的一端添加外主键,它维护的关系为一到多的关系,如:当载入一个组(group)时将会同时载入此组用户(user)的信息。它的关系映射将写在一的一端(group):                           
 <set name="users" order-by="name">
 <key column="relatedGroup"/>
 <one-to-many class="com.dvnchina.hibernate.User"/>         
 </set     
此时通过<key column="relatedGroup"/>在多的一端(user)添加了一个外键relateGroup指向一的一端。在一的一端通过users维护多的一端。  
                          
总之,一对多和多对一的映射策略是一致的,都是通过在""的一端添加一个外键指向""的一端,只是站的角度不同。

个人总结:
1、cascade写在某方,表示在操作此方时,与此方关联的另一方是否被操作。此关联是指操作时对象中包含的对象(比如保存部门时,dept.setEm(em),em对象也被保存)。
比如部门表--员工表,双向多多对一,cascade="delete"写在部门表,那么表示在删除部门时与此部门相关的员工也全部被删除!
2、关系的维护(inverse)通常都是交给多方

 

 

 

 

 

这篇关于在hibernate中一对多关联时会经常用到inverse和cascade属性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/398045

相关文章

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

MYSQL关联关系查询方式

《MYSQL关联关系查询方式》文章详细介绍了MySQL中如何使用内连接和左外连接进行表的关联查询,并展示了如何选择列和使用别名,文章还提供了一些关于查询优化的建议,并鼓励读者参考和支持脚本之家... 目录mysql关联关系查询关联关系查询这个查询做了以下几件事MySQL自关联查询总结MYSQL关联关系查询

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

org.hibernate.hql.ast.QuerySyntaxException:is not mapped 异常总结

org.hibernate.hql.ast.QuerySyntaxException: User is not mapped [select u from User u where u.userName=:userName and u.password=:password] 上面的异常的抛出主要有几个方面:1、最容易想到的,就是你的from是实体类而不是表名,这个应该大家都知道,注意