問題タブ [jpa-2.2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
479 参照

java - CascadeTypes が設定されていないのに、休止状態がデフォルトでカスケードするのはなぜですか?

swipe新しいオブジェクト を永続化しようとすると、次の例外が発生します。javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: org.munch.database.models.bunch.Munch

これが私が実行しているコードです:

また、参照用にエンティティを以下に貼り付けました。がentityManager.persist(it)呼び出されると、上記のエラーがスローされます。何らかの理由OneToManyで、エンティティの側面も保持しようとしていますが、機能しません。CascadeTypes両方の配列が空であることを確認したので、Swipe呼び出したものだけentityManager.persist()をdbに書き込む必要があることを理解しています。

操作で置き換えるpersistmerge成功しますが、マージにより、休止状態が追加selectの と のMunchを生成しますがselectSwipeこれは不要な操作です。Munchただし、マージは、更新操作を2 つの select ステートメントと 1 つの挿入のみにカスケードしているようには見えません。

要約すると、Hibernate はPersist操作をカスケードしてはならない場合にカスケードしているようです。解決策はmerge代わりに使用するpersistことですが、使用する1 insertと、merge結果として2 selects + 1 insert

ネイティブクエリを実行して挿入/更新する以外のアイデアはありませんが、可能であれば避けたいと思います。

ここに私のエンティティがあります:

Munch

Swipe

SwipeIdKey

0 投票する
1 に答える
122 参照

java - キー値が重複する可能性があるため、ステートメントは中止されました

私の Java EE アプリケーションの一部はユーザー管理です。私の開発環境は、Windows 10 上の Netbeans 12.0、JDK 14、Glassfish サーバー 5.1、Apache Derby DB、および Eclipse 永続性 JPA です。現在、開発段階で、サーバーを再起動するたびにテーブルを削除して作成するように JPA を構成しました。

エンティティに自動生成された主キーを使用するように構成されたエンティティ Bean「ユーザー」があります。

サーバーが起動するたびに、JAXB メカニズムを使用して、XML ファイルからのテスト データをすべてのテーブルに入力しました。「ユーザー」エンティティ Bean の UserList.xml のサンプルを次に示します。

アプリケーションが起動して実行されると、フロント エンドの JSF (Java Server Faces) ページを介してデータを視覚的に検証できます。すべて問題ないように見えます。これは、JAXB コードが最初のユーザー データをデータベースに正常にロードしたことを示しています。次の例外で終了するフロントエンドの JSF ページから新しいユーザーを追加しようとすると、恐ろしい問題が発生します。

「ユーザー」エンティティが自動キー生成を利用しているときにこのエラーが発生する理由がわかりません。最初の 3 つのデータは既にテーブルにロードされており、自動キー ジェネレーターは既に 4 にインクリメントされています。 (JPA が index=1 からキーの生成を開始すると仮定します)? したがって、JSF フロントエンド (XML ファイルからテーブルに初期データを追加するために JAXB が行ったのと同じ永続化コードを共有する) を介して追加する最初のユーザーには、id=5 を割り当てる必要がありますか?

最初は、XML ファイルの Id フィールド (つまり 1) がこのエラーに関係しているのかもしれないと思っていましたが、やはり自動キー生成スキームでは、XML の Id は JPA の自動生成された値で上書きされるべきでしょうか?

このフォーラムや他の場所でエラーに関する多くの投稿を既に読みましたが、エラー以外の私の状況との共通点は見つかりませんでした。このエラーの根本的な原因と、アプリケーションで主キーを生成せずに修正する方法についての明快な説明に感謝します。

更新 1: テーブル内の残りのデータ

徹底的な調査の結果、アプリケーションの起動時に User テーブルに常にデータが残っていることがわかりました。これは、persistence.xml ファイルで選択したドロップ アンド クリエイト ポリシーに違反しています (おそらく JPA の問題でしょうか?)。この場合、コンテナがシングルトン クラスの @postConstruct アノテーション付きメソッド loadData() を呼び出して XML ファイルから初期データをロードすると、自動キー生成が 1 から開始され、同じ ID を持つ残りの行の 1 つと競合が発生します。サーバーの起動時にテーブルからすべての行を削除するようにコードを修正したところ、問題はなくなりましたが、ログ ファイルに次の例外が記録されていますが、これはアプリケーションの問題や中断の原因にはなりません。

主キーを更新したり改ざんしたりしていないことは間違いなく、そのタスクを自動生成機能に任せたので、なぜこの例外が発生するのかわかりませんか? (ソース コードが必要な場合は、喜んで提供します)。