`
envy2002
  • 浏览: 151684 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

hibernate one-to-one级联保存

 
阅读更多

最近遇到一个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关系映射

    "Hibernate one-to-many / many-to-one关系映射"是两个基本的关系类型,用于表示实体间的关联。在这个主题中,我们将深入探讨这两种关系映射的原理、配置和实际应用。 一、一对一(one-to-one)与一对多(one-to-...

    hibernate many-to-one(多对一)及 cascade(级联).doc

    ### Hibernate Many-to-One (多对一) 及 Cascade (级联) #### 一、Many-to-One(多对一) 在数据库设计中,实体之间的关系主要包括一对一、一对多、多对多等几种类型。而在ORM(对象关系映射)框架Hibernate中,...

    Hibernate one-to-many-annotation

    在Hibernate中,`one-to-many`关系是常见的实体间关系之一,表示一个实体可以与多个其他实体相关联。本文将深入探讨`Hibernate one-to-many`注解的使用和实现细节。 ### 一、`@OneToMany`注解概述 `@OneToMany`...

    hibernate one-to-many 单/双向关联映射配置心得

    本文主要关注Hibernate中的一个核心概念——一对一(One-to-One)、一对多(One-to-Many)和多对一(Many-to-One)关联映射,特别是关于“一到多”单向和双向关联映射的配置心得。 首先,让我们了解“一到多”关联...

    Hibernate应用例子one-to-one

    【Hibernate应用例子one-to-one】 Hibernate 是一个强大的Java对象关系映射(ORM)框架,它允许开发者以面向对象的方式操作数据库,从而简化了数据库应用程序的开发。在Hibernate中,"one-to-one"(一对一)关联是...

    Hibernate one to many(many to one) 配置

    标题"Hibernate one to many(many to one) 配置"涉及到的是关系型数据库在Java中的持久化框架Hibernate中的两种关联映射关系:一对一(One-to-One)和多对一(Many-to-One)。在数据库设计中,这种关系很常见,例如...

    Hibernate one to one详细配置

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系映射类型之一。它用于表示两个实体之间一对一的关联关系,即一个实体对应另一个实体的唯一实例。下面将详细介绍Hibernate中如何进行一对一...

    hibernate-one-to-one-uni

    本项目“hibernate-one-to-one-uni”专注于探讨和实现Hibernate框架中的一对一(One-to-One)关系映射,这种关系在数据库设计中比较常见,用于表示两个实体之间一对一的联系。 一对一关系映射在Hibernate中分为两种...

    hibernate中基于外键的one2one

    在Java的持久化框架Hibernate中,一对一(One-to-One)关系映射是一种常见的实体关联方式。基于外键的One-to-One映射是其中的一种实现方式,它通过在一方或双方实体的表中添加外键来建立关联。接下来,我们将深入...

    Hibernate ORM - 一对一主键关联关系

    在Hibernate的配置文件中,可以使用`&lt;one-to-one&gt;`标签来定义一对一关系,如下: ```xml &lt;one-to-one name="profile" class="Profile" cascade="all"/&gt; &lt;param name="property"&gt;user ...

    Hibernate的级联操作(增,删,该)

    &lt;many-to-one name="childEntity" class="com.example.ChildEntity" cascade="all,delete-orphan" /&gt; ``` 在这个例子中,父实体的`childEntity`属性将执行全部级联操作,包括添加、删除和更新,同时`delete-orphan`...

    Hibernate-One-To-One

    【标题】:“Hibernate-One-To-One”详解 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它极大地简化了数据库操作。本主题主要关注的是Hibernate中的一个关键概念——一对一(One-To-One)关联...

    hibernate5--3.映射关系

    本文将深入探讨Hibernate5中的映射关系,主要包括多对多(Many-to-Many)和一对多(One-to-Many)这两种关系。 一、多对多映射(Many-to-Many) 多对多关系在数据库中表现为两个表之间存在多个连接记录,而在对象...

    hibernate最新版jar包(全)

    10. **多对一(One-to-Many)、一对多(Many-to-One)、一对一(One-to-One)、多对多(Many-to-Many)关系**: Hibernate支持这四种数据库关联关系,通过不同的注解配置来实现。 **使用Hibernate的步骤** 1. **...

    Hibernate的缓存级联查询

    外键映射是通过在主表映射文件中使用`one-to-one`元素,而从表映射文件中使用`many-to-one`元素来实现。主键映射则是两个实体类的主键相互关联,这需要在`one-to-one`节点上设置`constrained`属性为`true`,以表明...

    hibernate-one-to-many-uni

    【标题】"hibernate-one-to-many-uni" 指的是在Hibernate框架下实现的一对多单向关联关系。Hibernate是Java开发中常用的持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是数据库交互。在这个...

    Hibernate ORM - 一对一外键关联关系

    "一对一(One-to-One)"外键关联是Hibernate支持的一种关系映射类型,用于描述两个实体之间一对一的关联关系。这种关系通常存在于具有唯一性的实体之间,例如一个人只有一个身份证,或者一个员工只有一个办公桌。 *...

    Hibernate关联映射-one to one单向外键关联

    本话题主要探讨的是Hibernate中的一种关联映射方式——一对一(One-to-One)单向外键关联。这种关联模式通常用于两个实体之间存在唯一对应的关系,例如一个用户对应一个唯一的账户。 在Hibernate中,一对一关联可以...

    Hibernate ORM - 一对一连接表关联关系

    标题"Hibernate ORM - 一对一连接表关联关系" 提示我们,这里主要讨论的是Hibernate ORM框架在处理数据库中一对一(One-to-One)关联映射的方法。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者用...

    hibernate 全面学习->hibernate 关联映射学习

    本篇文章将全面探讨Hibernate的关联映射学习,包括一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)以及多对多(Many-to-Many)四种关系映射。 首先,一对一关联映射(One-to-One)是两个实体...

Global site tag (gtag.js) - Google Analytics