`
chillwarmoon
  • 浏览: 155055 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate中对集合的共享参照问题

阅读更多

最近的开发一直在持久层周围,虽然做hibernate也有一段时间了,但是随着数据库表的增加,遇到了一些以前没有碰到过的问题。其中有一个问题就是对集合的共享参照问题(found shared references to a collection)具体是这样的:
数据库表的关系如下:



关系是这样的ALARMINFO表通过交叉表ALARMAUDIT和AUDITINFO建立多对多关系,ALARMINFO自身是一对多的关系,ALARMINFO表和ALARMCOMPRESS表是多对一的关系。
在这里抛开ALARMCOMPRESS表不讨论,对象之间的关系是双向关联,目标是这样的:生成一个新的ALARMINFO对象alarmInfo该对象子集合alarmInfos已经获得,将其赋值给该对象alarmInfo,该对象的auditInfos的赋值是这样的:将alarmInfos的其中一个元素对应的多个auditInfos赋值给auditInfos。

那这样的话最终save对象alarmInfo就会产生共享参照,即alarmInfo对auditInfos的参照,alarmInfo的子集合alarmInfos中的一个元素对auditInfos的参照。

有什么方法能够在加载alarmInfos的其中一个元素的auditInfos集合,并赋值给alarmInfo后,使得该集合再次恢复到未加载前的lazy状态呢,这样就可以避免对集合的共享参照问题。或者还有其他的方法。

java 代码
 
  1. public class AlarmInfo{  
  2. private Set alarmInfos;  
  3. private Set auditInfos;  
  4. private AlarmCompress alarmCompress;  
  5. }  
  6.   
  7. public class  AuditInfo{  
  8. private Set alarmInfos;  
  9. }  
  10.   
  11. public class AlarmCompress{  
  12. private Set alarmInfos;  
  13. }  
分享到:
评论
11 楼 chillwarmoon 2007-07-10  
xianyun 写道
另外在更新一个游离对象时,如果它有一个属性集合,该集合包含的session已经过期了,更新时也是可能会报错的。最好是在当前session下根据id取出对象,修改要更新的属性,这样来更新。这是另外一个问题了。


往往在做架构设计的时候,对于延长Session的考虑不是很完美,这就引起hibernate延迟加载在复杂的环境中的问题。我的这个问题通过普通的sql语句解决了,但是没有用hibernate的函数来解决。
10 楼 xianyun 2007-07-10  
另外在更新一个游离对象时,如果它有一个属性集合,该集合包含的session已经过期了,更新时也是可能会报错的。最好是在当前session下根据id取出对象,修改要更新的属性,这样来更新。这是另外一个问题了。
9 楼 xianyun 2007-07-10  
chillwarmoon 写道
抽取的是集合中的detached object,所以说还是引用的同样的对象。


不同集合中引用同一个对象是没有问题的。但是集合是不同的集合。

hibernate返回的集合不是普通的java.util中的集合,它包含了session和所属关联父对象的信息,你不能把它直接赋给另一个对象。
8 楼 chillwarmoon 2007-07-10  
抽取的是集合中的detached object,所以说还是引用的同样的对象。
7 楼 xianyun 2007-07-10  
<br/>
<strong>chillwarmoon 写道:</strong>
<div class='quote_div'>
<div class='quote_div'>
<div>你没有明白我的意思,我的意思是alarmInfo对auditInfos的引用,和alarmInfo的子对象集合的其中一个元素对auditInfos的引用,这两个引用是相同的,当保存alarmInfo的时候,然后出现问题。<br/>
<br/>
</div>
</div>
</div>
这两个集合怎么能是相同的呢?集合是不同的集合,但里面的元素可能是相同的。保存的时候,将子alarmInfo的auditInfos中的元素一个个取出来,加入到父alarmInfo的auditInfos集合中。
6 楼 chillwarmoon 2007-07-10  
<br/>
<strong>xianyun 写道:</strong><br/>
<div class='quote_div'>
<p> </p>
<div>“那这样的话最终save对象<font color='#ff0000'>alarmInfo</font>就会产生共享参照,即<font color='#ff0000'>alarmInfo</font>对auditInfos的参照,<font color='#ff0000'>alarmInfo</font>的子集合alarmInfos中的一个元素对auditInfos的参照。”<br/>
<br/>
按照你的说法,父alarmInfo和一个alarmInfo之间的关系 与 子alarmInfo和这个alarmInfo之间的关系是分别保存的,这会有什么矛盾吗?不过这种方法数据量会增加一些,并且维护关系麻烦一些。</div>
</div>
<br/>
<br/>
你没有明白我的意思,我的意思是alarmInfo对auditInfos的引用,和alarmInfo的子对象集合的其中一个元素对auditInfos的引用,这两个引用是相同的,当保存alarmInfo的时候,然后出现问题。<br/>
<br/>
5 楼 xianyun 2007-07-10  
<p> </p>
<div>“那这样的话最终save对象<font color='#ff0000'>alarmInfo</font>就会产生共享参照,即<font color='#ff0000'>alarmInfo</font>对auditInfos的参照,<font color='#ff0000'>alarmInfo</font>的子集合alarmInfos中的一个元素对auditInfos的参照。”<br/>
<br/>
按照你的说法,父alarmInfo和一个alarmInfo之间的关系 与 子alarmInfo和这个alarmInfo之间的关系是分别保存的,这会有什么矛盾吗?不过这种方法数据量会增加一些,并且维护关系麻烦一些。</div>
4 楼 chillwarmoon 2007-07-10  
zwchen 写道
你觉得这样领域建模是最优的吗,能否换成另外一种方式?

不敢说这一种是最优的,但是业务上的需求就是这样的。
3 楼 zwchen 2007-07-10  
你觉得这样领域建模是最优的吗,能否换成另外一种方式?OO很多时候不是目的。
小心Hibernate做这种复杂的集合映射时,用得不妥,会遇到严重的性能问题。
如果你愿意使用原生sql方式,也不失为一种解决方案。
我觉得,在企业应用里面,没有太大的必要去较真,如果你真的想通过纯技术方式去解决这个问题,hernate的source code也许是最好的文档。
2 楼 xianyun 2007-07-10  
问一句,什么叫“共享参照”,你这个是复杂了点,但是有什么问题吗?要维护关系就是把一个对象加入到一个集合中,并且该集合的映射的inverse是false的,不行吗?
1 楼 chillwarmoon 2007-07-09  
文本编辑器不支持这样的写法吗?发上去的表的结构打乱了,不过结合文字应该能够判断出来三个表之间的关系。

相关推荐

    Hibernate Annotation 共享主键一对一双向关联

    在Hibernate中,我们可以使用`@OneToOne`和`@PrimaryKeyJoinColumn`注解来实现这种关联。`@OneToOne`用于声明一对一的关联,而`@PrimaryKeyJoinColumn`则指定主键同时也是外键的列。 例如,假设我们有两个实体类,...

    Hibernate帮助文档集合

    Hibernate帮助文档集合Hibernate帮助文档集合Hibernate帮助文档集合Hibernate帮助文档集合Hibernate帮助文档集合Hibernate帮助文档集合Hibernate帮助文档集合Hibernate帮助文档集合Hibernate帮助文档集合Hibernate...

    hibernate中的集合映射范例程序

    首先,集合映射是Hibernate中处理一对多、多对多关系的核心机制。它允许我们将一个实体对象与多个相关对象关联起来,这些相关对象可以存储在一个集合中。在Java中,常见的集合类型有List、Set、Map等,它们在...

    hibernate map 集合映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象的集合属性上,以便更好地管理和操作数据。这篇文章将深入探讨Hibernate中的集合映射机制,包括其基本概念、类型以及如何在实际开发中进行...

    hibernate set 集合映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象模型中的集合类,如List、Set、Map等。这允许我们在Java代码中操作对象集合,而Hibernate负责处理底层的SQL查询和数据存储。本文将深入探讨`...

    Hibernate学习文档集合

    这份文档详细阐述了Hibernate中最基础也是最核心的操作:CRUD(Create、Read、Update、Delete)以及动态查询和分页。CRUD操作是数据库管理的基础,Hibernate通过提供简单的API使得开发者能够轻松地对数据库进行这些...

    hibernate bag 集合映射

    在Hibernate中,集合映射是指将数据库中的表与Java集合对象(如List、Set等)进行关联,方便对一组相关数据进行操作。 "bag"是Hibernate中的一种集合类型,表示无序的、可重复的对象集合。在数据库层面,这通常对应...

    Hibernate集合映射

    在Hibernate中,可以通过`&lt;set&gt;`、`&lt;list&gt;`或`&lt;map&gt;`标签来实现这种映射。例如,假设我们有User和Order两个实体,一个User可以有多个Order,那么在User实体中,我们会定义一个Order类型的集合,并使用`&lt;set&gt;`标签...

    hibernate集合的映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象的集合属性上,以便实现对象关系映射(ORM)。本文将深入探讨Hibernate中的四种主要集合映射类型:Set、List、Array和Map,以及它们在实际...

    Hibernate 对集合属性的操作.zip_hibernate

    1. **集合类型**:在Hibernate中,集合类型通常有List、Set、Map和Bag等。List保证元素顺序,可能有重复元素;Set不允许有重复元素,不保证元素顺序;Map则存储键值对,其中键是唯一的;Bag则与List类似,但不保证...

    Hibernate集合映射与关联关系

    首先,让我们理解一下Hibernate中的集合映射。在关系型数据库中,一个实体(例如,student)可能与多个相关实体(如Score)有关系,这通常表现为集合形式。在Hibernate中,我们可以使用集合类(如List、Set、Map等)...

    hibernate list集合映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表与Java对象的集合属性关联的过程。List集合映射是其中常见的一种方式,它允许我们将数据库中的一组相关记录映射到Java对象的List列表中。这种映射机制使得...

    hibernate4源码集合

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate-search-analyzers-4.1.1.Final-sources.jar hibernate-search-engine-4.1.1.Final-sources.jar hibernate-search-orm-4.1.1.Final-sources.jar hibernate-...

    hibernate中文参考文档

    这部分将介绍如何在Hibernate中执行原生SQL查询。 14. 性能提升:本部分可能包括如何通过合理的配置、查询优化、缓存使用等手段提升Hibernate应用的性能。 15. 工具箱指南:Hibernate提供了许多工具类和实用方法来...

    hibernate常用方法集合

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它简化了与数据库之间的交互。`HibernateSessionFactory` 类是Hibernate应用中常见的一个工具类,用于管理和提供与当前线程相关的Session实例。让...

    hibernate-validator数据校验jar集合

    `Hibernate Validator`是一个开放源代码项目,由Hibernate团队维护,它基于JSR 303(Bean Validation 1.0)和JSR 349(Bean Validation 1.1)标准,用于在Java应用中执行对象级验证。 `Hibernate Validator`的主要...

    Hibernate映射集合属性List

    在Java持久化框架Hibernate中,映射集合属性是常见的需求,特别是对于那些具有一对多、多对多关系的实体对象。这里的"List"是Java集合框架中的一个接口,用于存储一组有序的元素,而在Hibernate中,它常用来映射...

    Hibernate在查询条件中创建List集合

    在Hibernate中,List集合常用于存储一对多(One-to-Many)或多对多(Many-to-Many)的关系,例如用户和他们的订单、学生和课程等。 在查询时,我们可能需要根据特定条件筛选出List集合中的元素。这可以通过HQL...

    Hibernate集合属性的延迟加载.doc

    在给定的文档中,我们看到一个例子,展示了如何在 Hibernate 中配置一个具有集合属性的实体类 `Person`,以及如何通过映射文件启用延迟加载。`Person` 类拥有一个 `Set&lt;Address&gt;` 类型的 `addresses` 属性,表示个人...

    hibernate 双向 多对对,一对多,一对一 映射的 集合

    在Java的持久化框架Hibernate中,映射关系是数据库表与Java对象之间的桥梁,它使得对象模型能够直接操作数据库中的数据。本主题将深入探讨双向多对多、一对多和一对一映射的概念及其在集合中的应用。 首先,我们来...

Global site tag (gtag.js) - Google Analytics