在Play Framework中重新附加分离的对象

时间:2013-07-10 23:34:06

标签: java hibernate jpa playframework-2.1

我有一个流程,用户可以创建一个对象(让我们称之为A)并在几个步骤中操作它。用户还可以向对象添加对持久化实体的引用(让我们调用持久化实体B)。我不想在数据库中保留A,除非最后一步已经完成,所以我在每一步之后都要缓存它。

我正在使用带有Java和JPA的Playframework,因此一旦从数据库中检索它,B就会分离,将其分配给A和缓存A.提交最后一步后,我需要再次拥有瞬态对象B以便持久化。

这是例外

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

存档的最佳方式是什么?

提前致谢

1 个答案:

答案 0 :(得分: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