[解決済み] PersistentObjectException: JPAとHibernateが投げるpersistに渡されたデタッチド・エンティティー
質問
JPAパーシステッドオブジェクトモデルに多対一のリレーションシップがあります。
Account
は、多くの
Transactions
. A
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
オブジェクトが正しく表示されます。しかし、トランザクションを作成すると
既に永続化された既存のアカウントを使って
を作成し
トランザクション
という例外が発生します。
原因: org.hibernate.PersistentObjectException: 永続化するために渡された未知のエンティティ: 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);
を正しく保存するにはどうすればよいですか?
Transaction
に関連付けられ、既に永続化された
Account
オブジェクトを作成しますか?
解決方法は?
これは典型的な双方向性一貫性の問題です。この問題については このリンク と同様に このリンク
前の2つのリンクの記事にあるように、双方向の関係の両側でセッターを固定する必要があります。片方のセッターの例は、次のとおりです。 このリンク
Many側のセッターの例としては このリンク
セッターを修正したら、Entity のアクセス タイプを "Property"にすることを宣言します。アクセスタイプを "Property"と宣言するベストプラクティスは、メンバープロパティから対応するゲッターにすべての注釈を移動することです。注意点としては、エンティティクラス内で "Field" と "Property" のアクセスタイプを混在させないことで、JSR-317仕様で定義されていない動作となります。
関連
-
[解決済み】不正な反射的アクセスとは?
-
[解決済み】スレッド「main」での例外 java.lang.StringIndexOutOfBoundsException: 文字列のインデックスが範囲外です。0 [閉店]
-
[解決済み】指定された子にはすでに親がいます。先に子の親に対してremoveView()を呼び出す必要がある(Android)
-
[解決済み】HTTPステータス500 サーブレットクラスのインスタンス化エラー [重複]。
-
[解決済み】Eclipseがエラーメッセージ "Java was started but returned exit code = 1" を返す
-
[解決済み】-XX:MaxPermSizeは何をするのですか?
-
[解決済み】メソッド本体がない、またはJavaで抽象的な宣言をする
-
[解決済み】Java Error "Exception in thread "main" java.util.InputMismatchException" Array プログラムで発生。
-
[解決済み] Spring Data JPAにおけるCrudRepositoryとJpaRepositoryのインターフェースの違いは何ですか?
-
[解決済み] JPA EntityManager。なぜmerge()ではなくpersist()を使うのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】StringUtils.isBlank() vs String.isEmpty()
-
[解決済み】不正な反射的アクセスとは?
-
[解決済み】Android Studioでタスク :app:compileDebugJavaWithJavac の実行に失敗しました。
-
[解決済み】指定された子にはすでに親がいます。先に子の親に対してremoveView()を呼び出す必要がある(Android)
-
[解決済み】HTTPステータス500 サーブレットクラスのインスタンス化エラー [重複]。
-
[解決済み】Mockitoでモックからチェックされた例外を投げる
-
[解決済み】「java -cp」と「java -jar」の違い?
-
[解決済み】ソースルート外のJavaファイル intelliJ
-
[解決済み] "java.nio.charset.MalformedInputException" を避けるために、すべての包括的なCharset。入力の長さ= 1"?
-
[解決済み] JPA EntityManager。なぜmerge()ではなくpersist()を使うのか?