我有一个JPA持久对象模型,该模型包含多对一关系:一个Account具有许多Transactions。A Transaction有一个Account。
Account
Transactions
Transaction
这是一段代码:
@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正确地持久保存该对象。但是,当我创建一个事务时,使用一个已经存在的持久化Account,并持久化该Transaction,我得到一个异常:
由以下原因引起:org.hibernate.PersistentObjectException:传递给持久对象的分离实体:org.hibernate.event.internal.DefaultPersistEventListener.onPersist上的com.paulsanwald.Account(DefaultPersistEventListener.java:141)
org.hibernate.PersistentObjectException
org.hibernate.event.internal.DefaultPersistEventListener.onPersist
com.paulsanwald.Account(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);
如何正确保存Transaction与已经存在的Account对象关联的?
解决方法很简单,只需使用CascadeType.MERGE代替CascadeType.PERSIST或即可CascadeType.ALL。
CascadeType.MERGE
CascadeType.PERSIST
CascadeType.ALL
我遇到了同样的问题,CascadeType.MERGE并为我工作。