我有一个使用JPA持久化的对象模型,其中包含一个多对一的关系:一个 账户(Account)
拥有许多 交易(Transactions)
。一个 交易(Transaction)
只属于一个 账户(Account)
。
以下是代码片段:
@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
)并持久化该交易时,会出现异常:
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.paulsanwald.Account at 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
?