几天前我问了一个相关问题,但没有得到解决,现在我有了新信息。那个问题是(HibernateTemplate.find() throws NonUniqueObjectException)。
我通过大量过度使用 printf 调试发现的是,基于观察 identityHashCodes,对象 1(其自然键是 4 个字段的组合)在登录附近创建,并缓存在会话中,因为它是有关登录用户的信息。
几个请求之后,一个页面从会话中拉出这个对象,并使用它和附加到它的一些数据来做出一些决定并按办公室分配过滤一些列表。但同样的自然键记录在这个会话的早些时候被加载为对象 2。
现在,我真的不知道 Hibernate 是如何再次意识到对象 1 的,因为它是在几个会话前创建的,我也没有在与对象 1 一起使用的代码中看到任何明显的东西,例如合并、保存或更新目的。然而,在 Hibernate 抛出 NonUniqueObjectException 的同一毫秒内,hibernate 调用了该对象上覆盖的 hashCode 方法(可以在上一篇文章中看到)。
所以我的问题是,Hibernate 是如何意识到这个对象 1 的?它当然知道对象 2,它在当前会话中实例化了它,但对象 1 是在几个会话前创建的。Hibernate 不应该能够自发地重新连接到这个对象。我虽然我不得不 merge() 重新连接。但我在代码中看不到这一点。某些方法将此对象用作参数或其他用途就足够了吗?