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