【发布时间】:2012-11-02 10:35:35
【问题描述】:
我有一个包含多对一关系的 JPA 持久对象模型:Account 有许多 Transactions。一个Transaction 有一个Account。
这是代码的sn-p:
@Entity
public class Transaction {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne(cascade = {CascadeType.ALL},fetch= FetchType.EAGER)
private Account fromAccount;
....
@Entity
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(cascade = {CascadeType.ALL},fetch= FetchType.EAGER, mappedBy = "fromAccount")
private Set<Transaction> transactions;
我能够创建一个Account 对象,向其中添加事务,并正确地持久化Account 对象。但是,当我创建一个事务时,使用现有的已持久化帐户,并持久化事务,我得到一个异常:
原因:org.hibernate.PersistentObjectException:分离的实体传递给持久化:com.paulsanwald.Account 在 org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)
因此,我能够持久化包含事务的Account,但不能持久化具有Account 的事务。我认为这是因为Account 可能没有附加,但是这段代码仍然给了我同样的异常:
if (account.getId()!=null) {
account = entityManager.merge(account);
}
Transaction transaction = new Transaction(account,"other stuff");
// the below fails with a "detached entity" message. why?
entityManager.persist(transaction);
如何正确保存与已持久化的Account 对象关联的Transaction?
【问题讨论】:
-
在我的例子中,我正在设置一个我试图使用实体管理器持久化的实体的 ID。当我删除了 id 的设置器时,它开始正常工作。
-
在我的情况下,我没有设置 id,但是有两个用户使用同一个帐户,其中一个用户(正确地)保留了一个实体,而当第二个用户尝试时发生错误持久化已经持久化的同一个实体。
标签: java hibernate jpa entity persist