一尘不染

PersistentObjectException:由JPA和Hibernate传递以持久保留的分离实体

java

我有一个JPA持久对象模型,该模型包含多对一关系:一个Account具有许多Transactions。A 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,并持久化该Transaction,我得到一个异常:

由以下原因引起: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对象关联的?


阅读 532

收藏
2020-02-28

共1个答案

一尘不染

解决方法很简单,只需使用CascadeType.MERGE代替CascadeType.PERSIST或即可CascadeType.ALL

我遇到了同样的问题,CascadeType.MERGE并为我工作。

2020-02-28