Hibernate一对多关联关系保存时的探究

在以前使用hibernate时,经常对保存存在关联关系的对象时,不确定是否能保存成功。
    因此,特意对一对多关系的2个对象进行实践。

一、pojo类和配置文件的准备

这里有一点提前说一下,外键列在数据库中并没有设置为不为null。因此可以出现外键为空的情况。

(1)pojo类

   

(2)映射文件

    

(3)测试类中方法的准备

二、双方都维护关联关系且双向关联

注意:这里的双向关联是指双向都建立关系

(1)1方和多方都保存,且建立了双向关联的关系。这样是肯定可以保存成功的。

(2)1方或多方中,有一方没有保存。那么会保存失败,因为保存时分类是瞬时态对象,所以失败。

(3)在(2)的代码的基础上,给product的映射文件中配置一个级联保存。这样在保存产品时就会级联保存分类,这样分类就不是瞬时态对象了,保存成功

三、双向维护外键,但只建立单向关联关系

(1)产品中没有分类,由于外键可以为null;因此可以保存成功

(2)产品中没有分类,分类中有产品。产品和分类都执行保存,保存成功

(3)产品中没有分类,分类中有产品,只保存分类。这里肯定保存失败,因为分类也会维护外键。

当分类维护外键时,发现集合里面的产品是瞬时态对象。所以肯定保存失败了

四、外键只靠多方维护

先把一方维护外键的功能取消,只需要在分类的映射文件中,配置inverse为true

(1)产品中有分类,只保存产品。这样由于保存产品时,会去维护外键,而用来维护外键的分类对象为瞬时态对象,所以一定保存失败

(2)针对(1)我们在保存产品后面添加保存分类。这样保存产品时,用于维护外键用的对象就是持久态对象了。这样就保存成功了。

(3)产品中有分类,分类中有产品,只保存分类。保存成功。因为分类不会维护外键,所以不管集合里面装什么状态的对象都不影响。

(4)产品中有分类,只保存分类。一定保存成功,因为分类不维护外键,且用于维护外键的对象也没有。道理同(3)。

五、总结

看了这么多实例,发现保存失败的原因都是一样的。就是拿来去更新外键的对象(这个描述可能有点绕口)不能是瞬时态。

比如,产品这一方维护外键的话,那么他的用来更新外键的对象就是他里面的那个分类。如果这个分类是瞬时态对象,肯定保存失败。

时间: 2024-10-18 04:54:59

Hibernate一对多关联关系保存时的探究的相关文章

hibernate 一对多关联关系(详细分析)

在领域模型中, 类与类之间最普遍的关系就是关联关系. 在 UML 中, 关联是有方向的. 以 Customer 和 Order 为例: 一个用户能发出多个订单, 而一个订单只能属于一个客户. 从 Order 到 Customer 的关联是多对一关联; 而从 Customer 到 Order 是一对多关联 单向关联 双向关联 单向 n-1 单向 n-1 关联只需从 n 的一端可以访问 1 的一端 域模型: 从 Order 到 Customer 的多对一单向关联需要在Order 类中定义一个 Cus

hibernate一对多单向关联时更新问题

需求:修改一个联系人,为其重新分配客户 问题:当更新一个托管态/持久态对象时,该对象关联了一个临时态对象,会报错 解决办法:使用级联保存更新 要更新谁,就在谁的映射文件中配置 <!-- 一对多关系映射: set元素的属性: cascade:级联操作. 取值: save-update:级联保存更新 delete:级联删除.--> <set name="linkmans" table="cst_linkman" cascade="save-u

Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotation) Many to Many 映射关系 多对多单向外键关联(XML/Annotation) 多对多双向外键关联(XML/Annotation) set的inverse元素详解 问题小结 关联关系的优缺点 多对一单向外键关联关系 注意多对一关联是多方持有一方的引用.看一个例子,去淘宝购物,那么一个

[原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

框架 day32 Hibernate,一级缓存,关联关系映射(一对多,多对多)

一级缓存 概念 *在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java集合构成了Session缓存. 只要 Session 实例没有结束生命周期, 存放在它缓存中的对象也不会结束生命周期 *当session的save()方法持久化一个对象时,该对象被载入缓存, 以后即使程序中不再引用该对象,只要缓存不清空,该对象仍然处于生命周期中. 当试图get(). load()对象时,会判断缓存中是否存在该对象,有则返回,此时不查询数据库.没有再查询数据库 *Session 能够在

Hibernate一对多(多对一)关联关系

上一篇博文总结了 Hibernate 的一对一的关联关系, 包括基于主键的单向一对一, 基于外键的单向一对一, 基于外键的双向一对一. 下面咱们说一下 Hibernate 的一对多关联关系. 其实一对多和多对一是一样的, 一对多反过来想就是多对一了. Hibernate的一对多可分为: 1. 单向一对多. 2. 双向一对多. OneByOne 一: 单向一对多 准备工作: 咱们以 客户(Customer) 和 订单(Order) 的例子来说, 一个客户可以有多个订单, 但是一个订单只能属于一个客

(转)Hibernate框架基础——一对多关联关系映射

http://blog.csdn.net/yerenyuan_pku/article/details/52746413 上一篇文章Hibernate框架基础——映射集合属性详细讲解的是值类型的集合(即集合元素是普通类型).现在从本文开始我们就要介绍实体类型的集合(即集合元素是另一个实体)了. 一对多关联关系映射 我们还是以一个活生生的例子来详解一对多关联关系映射吧!就以部门和员工的关系为例. 单向关联:仅仅建立从Employee到Department的多对一关联,即仅仅在Employee类中定义

(八)Hibernate的一对多关联关系

一.概述 例如,以客户(Customer)和订单(Order)为例,一个客户能有多个订单,一个订单只能有一个客户. 从Customer到Order是一对多关联,在java类中的面向对象设计应该一个Customer对象包含多个Order对象,因此应该定义一个集合,来包含所有的Order对象. 从Order到Customer是多对一关联,在java类中设计每个Order对象需要关联一个Customer对象,因此Order类中应该定义一个Cutomer类型的属性,来引用关联的customer对象. 但

hibernate映射的 关联关系:有 一对多关联关系,一对一关联关系,多对多关联关系,继承关系

hibernate环境配置:导包.... 单向n-1:单向 n-1 关联只需从 n 的一端可以访问 1 的一端 <many-to-one> 元素来映射组成关系: name: 设定待映射的持久化类的属性的名字 column: 设定和持久化类的属性对应的表的外键 class:设定待映射的持久化类的属性的类型 建立1所对应的封装类,这儿只写属性,setter和getter就不写了: private Integer customerId; private String customerName; 建立