0

我有一个过程,用户可以创建一个对象(我们称之为 A)并通过几个步骤操作它。用户还可以向对象添加对持久化实体的引用(我们称其为持久化实体 B)。除非最后一步完成,否则我不想将 A 持久保存在数据库中,因此我在每一步之后都将其缓存。

我正在将 Playframework 与 Java 和 JPA 一起使用,因此当我从数据库中检索到 B 时,它就会被分离,将其分配给 A 并缓存 A。提交最后一步后,我需要再次拥有一个瞬态对象 B 以便坚持下去。

这是例外

[PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: models.B]

存档的最佳方法是什么?

提前致谢

4

1 回答 1

0

我对你的问题有点疑惑。实体对象只有在它们曾经由持久性上下文管理(例如:它们曾经被保存/更新/从数据库中检索)或者您创建一个新的实体对象并设置其主键字段时才会处于分离状态。在那之前,你的实体总是短暂的。因此,看看您的要求,为什么不将所有内容保持瞬态(例如:将其保存在 http 会话中)直到最后一步并坚持所有内容?

附带说明一下,如果我没记错的话,分离和瞬态之间的区别是主键字段。因此,如果您有一个分离的对象并且您将主键字段重置为默认值(0 或 null),那么您可以说它是一个临时实体。在引擎盖下可能有一些对象代理留在分离实体上,但不是瞬态的,但我认为它不应该影响行为:

// start transaction A..
User u1 = new User("Sam");  // u1 is transient
em.persist(u1);             // u1 is managed, say database gives us id 1
// commit and end transaction A..
em.detach(u1);              // u1 is detached

// start transaction B..
User u2 = new User("Sammy");// u2 is transient
u2.setId(1);                // u2 can be treated as detached object of u1 because it has same id
em.merge(u2);               // this should updates the user row with id 1 name from 'Sam' into 'Sammy'
// commit and end transaction B
于 2013-07-11T00:22:58.103 回答