我使用以下代码片段将带有多个持久集合的分离对象重新附加到新的Hibernate会话中:
sessionFactory.getCurrentSession().lock(myDetachedObject);
此代码在AspectJ切入点中执行,只要访问持久性集合就会触发该切入点。
对象在分离时不会被修改,一旦重新附加,我就能够毫无问题地访问和修改对象的持久集合。但是,如果我在重新连接后不访问任何持久性集合,那么当我关闭会话并提交我的工作时,将从数据库中删除所有持久性集合 。就像我在每个方法上调用clear()
方法一样。
我的所有馆藏都明确配置为CascadeType.ALL
,我的理解是,在这样做时,它们会作为LOCK
事件的一部分正确地重新附加到会话。我理解,如果持久集合我不访问任何内容,那么在Hibernate准备刷新会话时触发切入点。是否有其他方法可以将对象重新附加到会话中,以防止Hibernate不正确地删除集合?
更新:我尝试过其他锁定模式(LockMode.READ
,LockMode.UPGRADE
)和重新附加方法(调用session.update()
代替session.lock()
) 。这些可预测地改变了重新附着动作的行为,但不改变结果。收藏品仍然被删除。我还写了一个小测试,以确认只有在刷新操作期间重新附加对象时才删除集合。