最近的开发一直在持久层周围,虽然做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 代码
- public class AlarmInfo{
- private Set alarmInfos;
- private Set auditInfos;
- private AlarmCompress alarmCompress;
- }
-
- public class AuditInfo{
- private Set alarmInfos;
- }
-
- public class AlarmCompress{
- private Set alarmInfos;
- }
分享到:
相关推荐
Struts、Spring、Hibernate是Java开发中的三大主流框架,它们分别负责不同的职责,共同构建了企业级应用的基础架构。在面试中,理解这三个框架的工作原理和应用场景是非常重要的。 1. **Hibernate**: - **工作...
- 并发控制:解决多个事务同时操作同一数据时可能出现的问题,如死锁、丢失更新等。 - 锁机制:共享锁(读锁)和独占锁(写锁)的概念及其使用。 - 两阶段提交协议(2PC):分布式事务的协调方法。 7. **第8章 ...
- **同步代码块**:控制多个线程对共享资源的访问。 - **同步方法**:自动对当前对象加锁。 ##### 5. volatile关键字的使用 - **保证可见性**:确保一个线程对变量的修改能立即被其他线程看到。 - **禁止指令重排*...
- **数据共享问题(The Data-Sharing Problem)**:随着应用规模的增长,如何有效地共享数据成为一个重要的问题。 **7.2 数据库客户端与服务器** - **数据库客户端与服务器(Database Clients and Servers)**:现代...