多対 1 の関係を含む JPA 永続オブジェクト モデルがあります。 にはAccount
多数の があり、Transactions
にはTransaction
1 つの があります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: 分離されたエンティティが永続化に渡されました: com.paulsanwald.Account at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)
したがって、トランザクションを含む を永続化することはできますAccount
が、 を持つ Transaction を永続化することはできません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
?
ベストアンサー1
解決方法は簡単です。またはCascadeType.MERGE
の代わりにを使用するだけです。CascadeType.PERSIST
CascadeType.ALL
私も同じ問題を抱えていましたが、CascadeType.MERGE
うまくいきました。
うまく解決したことを祈っています。