在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

相关文章

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务

Spring Cache注解@Cacheable的九个属性详解

《SpringCache注解@Cacheable的九个属性详解》在@Cacheable注解的使用中,共有9个属性供我们来使用,这9个属性分别是:value、cacheNames、key、key... 目录1.value/cacheNames 属性2.key属性3.keyGeneratjavascriptor

Spring Boot 事务详解(事务传播行为、事务属性)

《SpringBoot事务详解(事务传播行为、事务属性)》SpringBoot提供了强大的事务管理功能,通过@Transactional注解可以方便地配置事务的传播行为和属性,本文将详细介绍Spr... 目录Spring Boot 事务详解引言声明式事务管理示例编程式事务管理示例事务传播行为1. REQUI

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门