問題タブ [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.
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に書き込む必要があることを理解しています。
操作で置き換えるpersist
とmerge
成功しますが、マージにより、休止状態が追加select
の と のMunch
を生成しますがselect
、Swipe
これは不要な操作です。Munch
ただし、マージは、更新操作を2 つの select ステートメントと 1 つの挿入のみにカスケードしているようには見えません。
要約すると、Hibernate はPersist
操作をカスケードしてはならない場合にカスケードしているようです。解決策はmerge
代わりに使用するpersist
ことですが、使用する1 insert
と、merge
結果として2 selects + 1 insert
ネイティブクエリを実行して挿入/更新する以外のアイデアはありませんが、可能であれば避けたいと思います。
ここに私のエンティティがあります:
Munch
Swipe
SwipeIdKey
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 つと競合が発生します。サーバーの起動時にテーブルからすべての行を削除するようにコードを修正したところ、問題はなくなりましたが、ログ ファイルに次の例外が記録されていますが、これはアプリケーションの問題や中断の原因にはなりません。主キーを更新したり改ざんしたりしていないことは間違いなく、そのタスクを自動生成機能に任せたので、なぜこの例外が発生するのかわかりませんか? (ソース コードが必要な場合は、喜んで提供します)。