最近遇到一个hibernate使用有趣的问题。一对一级联保存问题。
应用的情境是主表,从表。比方说有个主表 比方说班级吧。
班级有属性 id, name 等等。然后一个从表 就叫student吧,一个班级有多个student.
那么配置起来,班级xml 里面如下。
<set name="student" cascade="all" lazy="false" order-by="STUDENTSID desc" >
<key column="CLASSID"/>
<one-to-many class="com.jj.pojo.student"/>
</set>
这样new 一个班级 class,然后 new 几个学生,放入set,设置class的学生集合 class_one.setStuents(set1);
这样hibernate插入class, student,
insert into table class (id, $$,$$,...) values(?,?,?..);
insert into table student (id, $$,$$,...) values(?,?,?..);
update student set $$ =? where **;
这样就把 class student都插入表中了,而且也更新了他们之间的关系。
现在情境扩展了,每个class又增加了对应的关系,比如说,就叫profile吧,记录每个班级的位置,经费,荣誉值,以及其他的信息,暂且这个表叫做 profile.
profileid, classid, attr1, attr2.
如果再在class里面用set的话,也可以,但是语义不太贴切,用one-to-one吧,但是这个one-to-one设置开始没设对。就可能只插入,但是没有它们之间的关系。
在class里面设置一个
<one-to-one name="profile" class="com.jj.pojo.profile" cascade="all"></one-to-one>
同时也在profile里面设置一个。
<one-to-one name="class" class="com.jj.pojo.class" ></one-to-one>
并且改改profile的id.
<id name="classid" type="java.lang.Integer" column="CLASSID">
<generator class="foreign">
<param name="property">class</param>
</generator>
</id>
这样设置的话,表面profile表中这个CLASSID这个字段来源于 pofile这个对象中的class对象,插入数据库的时候以此为准。
但是有人会问,profile的id不是profileid吧,如果没有设置,怎么可以,事实证明,不设置确实可以,如果mysql中profileid是自增长的,这个值是会有的。
但是这个过程和set集合产生的sql语句是不一样的,这个是没有update语句的。
我以我的推断来分析一下。
hibernate 有缓存,最后入库要以缓存中对象最后的状态为依据,
在一对多中,class插入数据库,获得了classid, 同时缓存中的对象的classid由null更新为 一个数字,通知和它相关联的集合更新,相关联的集合如何获知呢,只能通过。
<set name="student" cascade="all" lazy="false" order-by="STUDENTSID desc" >
<key column="CLASSID"/>
<one-to-many class="com.jj.pojo.student"/>
</set>
和 classid相关联的有集合student.
所以hibernate把插入的集合遍历一遍,一次打印出一条update ......
但是one-to-one这个设置,
我们把class插入的数据库中去的时候,其实这个时刻缓存中的class对象已经获取到了classid,但是和这个class相关联的profile对象是如何去更新状态了,但从one-to-one的配置很难看出哦。
<one-to-one name="class" class="com.jj.pojo.class" ></one-to-one>
那所以就要配置这个id了,通过这个配置来找他们的关联。
<id name="classid" type="java.lang.Integer" column="CLASSID">
<generator class="foreign">
<param name="property">class</param>
</generator>
</id>
所以当插入profile的时候,profile的classid已经是有了的(就是class对象的id),所以直接插入对象即可。
所以不需要update了。
也许你要说 如果这样的话,set集合的update也可以不需要了,为什么呢? 我其实不知道,感觉这个hibernate的内幕机关重重,水太深。
分享到:
相关推荐
"Hibernate one-to-many / many-to-one关系映射"是两个基本的关系类型,用于表示实体间的关联。在这个主题中,我们将深入探讨这两种关系映射的原理、配置和实际应用。 一、一对一(one-to-one)与一对多(one-to-...
### Hibernate Many-to-One (多对一) 及 Cascade (级联) #### 一、Many-to-One(多对一) 在数据库设计中,实体之间的关系主要包括一对一、一对多、多对多等几种类型。而在ORM(对象关系映射)框架Hibernate中,...
在Hibernate中,`one-to-many`关系是常见的实体间关系之一,表示一个实体可以与多个其他实体相关联。本文将深入探讨`Hibernate one-to-many`注解的使用和实现细节。 ### 一、`@OneToMany`注解概述 `@OneToMany`...
本文主要关注Hibernate中的一个核心概念——一对一(One-to-One)、一对多(One-to-Many)和多对一(Many-to-One)关联映射,特别是关于“一到多”单向和双向关联映射的配置心得。 首先,让我们了解“一到多”关联...
【Hibernate应用例子one-to-one】 Hibernate 是一个强大的Java对象关系映射(ORM)框架,它允许开发者以面向对象的方式操作数据库,从而简化了数据库应用程序的开发。在Hibernate中,"one-to-one"(一对一)关联是...
标题"Hibernate one to many(many to one) 配置"涉及到的是关系型数据库在Java中的持久化框架Hibernate中的两种关联映射关系:一对一(One-to-One)和多对一(Many-to-One)。在数据库设计中,这种关系很常见,例如...
在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系映射类型之一。它用于表示两个实体之间一对一的关联关系,即一个实体对应另一个实体的唯一实例。下面将详细介绍Hibernate中如何进行一对一...
本项目“hibernate-one-to-one-uni”专注于探讨和实现Hibernate框架中的一对一(One-to-One)关系映射,这种关系在数据库设计中比较常见,用于表示两个实体之间一对一的联系。 一对一关系映射在Hibernate中分为两种...
在Java的持久化框架Hibernate中,一对一(One-to-One)关系映射是一种常见的实体关联方式。基于外键的One-to-One映射是其中的一种实现方式,它通过在一方或双方实体的表中添加外键来建立关联。接下来,我们将深入...
在Hibernate的配置文件中,可以使用`<one-to-one>`标签来定义一对一关系,如下: ```xml <one-to-one name="profile" class="Profile" cascade="all"/> <param name="property">user ...
<many-to-one name="childEntity" class="com.example.ChildEntity" cascade="all,delete-orphan" /> ``` 在这个例子中,父实体的`childEntity`属性将执行全部级联操作,包括添加、删除和更新,同时`delete-orphan`...
【标题】:“Hibernate-One-To-One”详解 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它极大地简化了数据库操作。本主题主要关注的是Hibernate中的一个关键概念——一对一(One-To-One)关联...
本文将深入探讨Hibernate5中的映射关系,主要包括多对多(Many-to-Many)和一对多(One-to-Many)这两种关系。 一、多对多映射(Many-to-Many) 多对多关系在数据库中表现为两个表之间存在多个连接记录,而在对象...
10. **多对一(One-to-Many)、一对多(Many-to-One)、一对一(One-to-One)、多对多(Many-to-Many)关系**: Hibernate支持这四种数据库关联关系,通过不同的注解配置来实现。 **使用Hibernate的步骤** 1. **...
外键映射是通过在主表映射文件中使用`one-to-one`元素,而从表映射文件中使用`many-to-one`元素来实现。主键映射则是两个实体类的主键相互关联,这需要在`one-to-one`节点上设置`constrained`属性为`true`,以表明...
【标题】"hibernate-one-to-many-uni" 指的是在Hibernate框架下实现的一对多单向关联关系。Hibernate是Java开发中常用的持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是数据库交互。在这个...
"一对一(One-to-One)"外键关联是Hibernate支持的一种关系映射类型,用于描述两个实体之间一对一的关联关系。这种关系通常存在于具有唯一性的实体之间,例如一个人只有一个身份证,或者一个员工只有一个办公桌。 *...
本话题主要探讨的是Hibernate中的一种关联映射方式——一对一(One-to-One)单向外键关联。这种关联模式通常用于两个实体之间存在唯一对应的关系,例如一个用户对应一个唯一的账户。 在Hibernate中,一对一关联可以...
标题"Hibernate ORM - 一对一连接表关联关系" 提示我们,这里主要讨论的是Hibernate ORM框架在处理数据库中一对一(One-to-One)关联映射的方法。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者用...
本篇文章将全面探讨Hibernate的关联映射学习,包括一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)以及多对多(Many-to-Many)四种关系映射。 首先,一对一关联映射(One-to-One)是两个实体...