以下是我级联保存的做法:
双向一对多
1. 在一的一端设置级联(cascade="save-update")
2. 不要让一的一端来维护关系(set中的设置inverse="true")
3. 保存时一的一端添加多的一端(set.add()),多的一端设置一的一端(setXX())
4. 保存一的一端
双向多对多
1. 在A端设置级联(cascade="save-update")以及关系维护(inverse="false")
2. 保存时A端添加B端(set.add())
3. 保存A端
这两种都存在一个问题:若其中的一端(比如一对多里多的一端)已存在,则会产生update语句来修改该端的表,即使这个表都没有被修改过。我的猜测是由于有设置cascade,所以会有级联的操作,而且级联操作调用的是saveOrUpdate,那么表既然存在所以是update了。这个问题比较讨厌,不知道能不能不要产生update语句。
相关的测试是:
TestEnterprise(企业)----TestUser(人员),他们之间是一个一对多的关系
其中TestEnterprise的相关配置
<set name="testUsers" inverse="true" cascade="save-update">
<key>
<column name="EID" precision="22" scale="0" />
</key>
<one-to-many class="domain.TestUser" />
</set>
TestUser的相关配置
<many-to-one name="testEnterprise" class="domain.TestEnterprise" fetch="select">
<column name="EID" precision="22" scale="0" />
</many-to-one>
测试代码
TestEnterprise enterprise = new TestEnterprise();
enterprise.setName("xxx");
TestUser user = dao.getById(6l, TestUser.class);
enterprise.getTestUsers().add(user);
user.setTestEnterprise(enterprise);
dao.save(enterprise);
控制台显示
select testuser0_.ID as ID1_0_, testuser0_.EID as EID1_0_, testuser0_.NAME as NAME1_0_, testuser0_.PASSWORD as PASSWORD1_0_, testuser0_.STATUS as STATUS1_0_ from DBO.TEST_USER testuser0_ where testuser0_.ID=?
select max(ID) from TEST_ENTERPRISE
insert into DBO.TEST_ENTERPRISE (NAME, ID) values (?, ?)
update DBO.TEST_USER set EID=?, NAME=?, PASSWORD=?, STATUS=? where ID=?
就是最后多了一个update语句,如果我把 cascade="save-update"去掉的话就不会有了,但是这样显然不行。另外这个问题和保存一的一端还是保存多的一端都没什么关系,无论保存的是哪端都有产生这样的问题。现在请教各位了。
分享到:
相关推荐
博主可能通过具体的例子展示了如何配置和使用级联查询,以及可能遇到的问题和解决方案。 **标签解析:** 1. **源码** - 暗示内容可能涉及Hibernate框架的内部实现,可能会讲解到相关的Java代码或者XML配置文件,...
在Java的持久化框架中,Hibernate是一个非常常用且强大的ORM(对象关系映射)工具,它使得开发者可以方便地将数据库操作转化为面向对象的方式。在实际的项目开发中,我们经常遇到各种各样的关联关系,比如一对一、一...
在数据库中,一对一关系意味着两个表中的每一行都对应另一个表中唯一的一行。在Hibernate中,我们可以通过在实体类的映射文件或使用注解来定义这种关系。 ### 定义一对一关系 1. **共享主键**:这是通过让两个实体...
10. **级联操作(Cascading)**:级联操作允许在一个对象的操作中自动处理相关对象,如删除一个实体时,可以选择是否同时删除与其关联的其他实体。 11. **集合映射**:Hibernate支持多种集合类型(List, Set, Map等...
在Java的持久化框架中,Hibernate是一个非常重要的工具,它为开发者提供了强大的对象关系映射(ORM)功能,使得在Java应用中操作数据库变得更加简单。本文将深入探讨Hibernate中的一对多和多对一映射关系,并通过一...
标题"Hibernate双向一对多"指的是Hibernate框架中的一个重要关系映射概念,即在一个实体类中,一个实例可以与多个另一个实体类的实例相关联,而在另一个实体类中,每个实例也可以关联到该实体类的一个实例。...
在Java的持久化框架Hibernate中,一对多关系(OneToMany)是一种常见的对象关系映射(ORM)映射方式,它模拟了数据库中一个表的一条记录与另一表的多条记录之间的关联。本教程通过源代码的形式,讲解如何在Hibernate...
如果在保存一个对象时,该对象引用了一个未保存的瞬态对象,Hibernate会尝试同时保存这两个对象,但在这个过程中,若主对象保存成功而从属对象失败,则会引发此异常。解决方案是在保存主对象之前,先确保所有从属...
10. **级联操作(Cascading)**:级联操作允许将一个实体的操作(如保存、删除)应用到与其关联的其他实体上,简化了代码。 通过学习《精通Hibernate》这本书,读者可以深入了解Hibernate的这些核心概念,并掌握...
在一对一关系中,两个实体之间通常会有一个共享的唯一标识,即一个实体的主键同时作为另一个实体的外键。 `@OneToOne`注解在Hibernate中用于定义一对一的关系,可以是单向或双向的。单向关联意味着在一个实体类中...
通过这份中文参考文档,开发者可以全面了解Hibernate3.12的功能,解决在开发过程中遇到的问题,并掌握如何高效地使用Hibernate进行数据持久化操作。对于Java开发者,尤其是初次接触Hibernate的人来说,这是一份极具...
在实际开发中,我们可能还会遇到一些问题,比如懒加载(Lazy Loading)、EAGER加载策略的选择,以及级联操作的合理设置等。这些都需要根据业务需求和性能考虑来调整。 总之,Hibernate的一对一主键关联映射,特别是...
Hibernate 是一个非常流行的开源对象关系映射(ORM)框架,它为Java开发者提供了在Java应用程序中操作数据库的强大工具。在Hibernate 3.2版本中,该框架引入了许多增强功能和优化,使得Java开发人员能够更加便捷地...
标题中的“hibernate bag ...通过以上信息,我们可以深入了解Hibernate的bag集合映射,包括其配置、使用以及可能遇到的问题。在实际项目中,正确理解和运用这一特性可以大大提高开发效率,同时减少数据库操作的复杂性。
11. **实用工具和技巧**:分享一些开发过程中可能遇到的问题及解决方法,如对象持久化、异常处理和调试技巧。 通过《韩顺平2011Hibernate3.3视频教程资料》,开发者不仅可以掌握Hibernate的基本使用,还能深入了解...
本主题主要针对一个关于Hibernate的PPT中存在的问题进行分析和解答。通过www.willvc.com.cn这个网址,我们可以推测这是一个寻求帮助或讨论的平台,可能有更详细的问题描述和反馈。 【描述】:“Hibernate PPT 问题 ...
- **级联操作**: 可以设置级联属性,使得对一个实体的操作影响到与其关联的其他实体。 5. **缓存机制** - 第一级缓存:Session级别的缓存,每个Session都有自己的缓存,存储了最近访问过的对象。 - 第二级缓存:...
Hibernate是一个开源的对象关系映射(Object-Relational Mapping, ORM)框架,用于简化Java应用中的数据库交互过程。它允许开发者以面向对象的方式操作数据库,而无需直接编写SQL语句。Hibernate通过提供一种称为...
在这个"hibernate.zip"压缩包中,包含的是Hibernate 3.6.0版本的资源,这是一个相对稳定的版本,适合初学者和有一定经验的Java开发者学习和使用。 1. **Hibernate 3.6.0 版本**: 这个版本是Hibernate历史上的一个...
在博文《hibernate 多对一映射关联配置》中,作者可能详细阐述了如何配置这些属性,以及在实际项目中遇到的问题和解决方案。文档心得.doc可能包含了作者的个人经验,如优化查询效率、处理空值问题、避免级联操作带来...