遇到这样的问题。加载了 2 个对象的集合(按主键,使用条件)。然后在循环中迭代它们。当处理第一个对象时,在离这个循环非常远的地方,通过与循环中第二个对象相同的主键加载对象。在这里,我看到这 2 个对象的 System.identityHashCode() 不同。当处理循环中的第二个对象并尝试保存它时,出现异常:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
尝试用简单的对象模拟这个问题,加载,修改,再次通过 PK 加载,用不同的事务传播保存我总是得到相同的对象实例...... 您能告诉我什么时候可以通过 PK 在同一 session 加载中获取第二个对象实例吗?
最佳答案
在我的情况下,问题是因为: 首先,我通过主键加载了一些实体“A”。 然后我使用一些标准加载了另一个实体“B”,这些标准通过 hbm 映射引用了这个相同的(通过 PK)实体“A”(例如 B-> 某些实体 C->A)并且 hibernate 没有'使用已经加载的 'A' 实体,但第二次加载或创建它(我在实体 'A' 构造函数中放置断点),因此在单个 session 中我们有 2 个具有相同 PK 但不同实例的实体。尝试保存实体“A”时出现异常“NonUniqueObjectException”。 加载实体“B”有些距离非常非常远,并且在某些情况下可以重现和识别问题。 为了更快地找到这些地方,很容易在“NonUniqueObject”构造函数中放置断点,并找到第二次加载该实体的人。 顺便说一下,在我加载实体“B”之后,我没有尝试调用 B->C->A,lazy='proxy' 或根本没有惰性,这意味着每个请求加载 C。对我来说有些神秘......
关于java - hibernate 。什么时候同一实体可以在一个 session 中加载两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20606568/