問題タブ [hibernate-cascade]
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 - Hibernate One to Many 新しい子を追加
同様の質問に関する多くの記事と回答を読みましたが、まだ理解できません。
ここに私の親クラス:
ここでは、Items と Friends of User の 2 つのセットを確認できます。
UserItemId クラスの例:
そして今、私は新しいアイテムをユーザーに追加しようとしています:
しかし、私はエラーが発生しました:
org.hibernate.NonUniqueObjectException: 同じ識別子値を持つ別のオブジェクトが既にセッションに関連付けられています
主な問題はCascadeTypesにあることを理解しています-休止状態は私が望むことを実行できないため、これはこれに最適なバリアントではありません-ユーザーは永続オブジェクトであり、永続的な新しいアイテムに追加してデータベースに保存するだけであることを理解してください。親クラス(ユーザー)と子(アイテム)があり、新しいアイテムを追加して親からアイテムを削除してデータベースに保存したい場合、この状況で勝つためのベストプラクティスは何ですか。実際、私は(イテレータを使用して)作業方法を見つけましたが、高負荷プロジェクトでは、そのような操作のループを作成する最悪のバリアントであることを理解しています。そのような状況のベストプラクティスを見つけたいと思っています。
質問の更新: 私は間違いを犯しました。セットに子を追加するコードを呼び出すと(上記のコード)-すべて問題ありません-データベースとエンティティに子が追加されましたが、子を削除しようとすると:
それから私は例外を得ました:
org.hibernate.NonUniqueObjectException: 同じ識別子値を持つ別のオブジェクトが既にセッションに関連付けられています
もう1つの更新:
多くの実験の後、アイテムを追加する作業コードを取得しました:
ユーザーにアイテムを追加するサービス層のメソッドのコードです。そしてそれは働いています。そして、ユーザーからアイテムを削除するための半作業コードがあります:
正しく動作するコードではありません。状況があります-ユーザーは3つのアイテムを持っています。アイテムを 1 つ削除します。すべて問題ありません。後で、もう 1 つのアイテムを削除しようとすると、休止状態に次のように表示されます。
ObjectNotFoundException: 指定された識別子を持つ行が存在しません
つまり、キャッシュにはまだ3つのアイテムがあります-最初に削除したアイテム-キャッシュと休止状態にまだあり、データベースに追加しようとしていますが、削除されています。
そして、この質問に答えるのに役立つもう 1 つのマインド アイデアがあります。オブジェクト ユーザー - 子を削除しようとしている場所 - SecurityContext からログに記録されたユーザーです - コントローラーから取得しました - コントローラーには、ユーザーがセキュリティから取得した場所に注釈があります。そのため、休止状態には既にキャッシュに記録されたユーザー (User オブジェクト) があります。何か案は?
spring - Spring リポジトリ カスケード
Spring Data リポジトリを使用してエンティティを保存していますが、何らかの理由でカスケードがテスト saveCountryAndNewCity() で機能しません。都市は保存されませんが、同様の saveCityAndNewCountry() で機能します。誰かが理由を理解するのを手伝ってくれますか? どうも。
java - Hibernate OnDelete Cascade は MySql では機能しませんが、postgres と M-Sql では機能します
私は2つのエンティティを持っています。Post->Threadからの OnetoOne マッピングを使用したThreadエンティティとPostエンティティ。
Threadエンティティには多数の投稿が含まれます。OnetoOne の代わりに OnetoMany を使用する必要があったことはわかっていますが、すべてのコレクションの問題を回避するために OnetoOne を使用しています
問題は、スレッドを削除すると、それに関連付けられているすべての投稿も削除する必要があることです。を使用して成功しています
ただし、Postgres と Ms-SQl でのみ機能し、MySql では機能しません (InnoDb も試しました)。スキーマ生成クエリでは、on delete カスケードは生成されません。
以下はコードです
次のクエリを使用してThreadエンティティからアイテムを削除しているときに、次のエラーが発生します
2014 年 9 月 2 日 8:33:51 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 警告: SQL エラー: 1451、SQLState: 23000 2014 年 9 月 2 日 8:33:51 PM org.hibernate.engine.jdbc. spi.SqlExceptionHelper logExceptions エラー: 親行を削除または更新できません: 外部キー制約が失敗しました (
forum
.post_tbl
, CONSTRAINTFK_bfbv5nknqj7ppd5630scimhtb
FOREIGN KEY (ThreadID_thread_id
) REFERENCESthread_tbl
(thread_id
)) org.hibernate.exception.ConstraintViolationException: org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:74) でステートメントを実行できませんでした org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java: 49) org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) で org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) で org.hibernate.engine .jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:136) は org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:58) で(AbstractEntityPersister.java:3343) org.hibernate.persister で。entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3546) at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:100) at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377) org.hibernate.engine.spi.ActionQueue.executeActions (ActionQueue.java:369) で org.hibernate.engine.spi.ActionQueue.executeActions (ActionQueue.java:293) で org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions で(AbstractFlushingEventListener.java:339) org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234) org.hibernate.internal. org.hibernate.engine.transaction.internal.jdbc の SessionImpl.managedFlush(SessionImpl.java:404)。test.main(test.java:84) での org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175) での JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) 原因: com.mysql.jdbc .exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 親行を削除または更新できません: 外部キー制約が失敗します (forum
.post_tbl
、制約のFK_bfbv5nknqj7ppd5630scimhtb
外部キー (ThreadID_thread_id
) 参照thread_tbl
(thread_id
)) HibernateException : sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) で sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) で、sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) でステートメントを実行できませんでしたjava.lang.reflect.Constructor.newInstance(Constructor.java:408) com.mysql.jdbc.Util.handleNewInstance(Util.java:411) com.mysql.jdbc.Util.getInstance(Util.java:386) ) com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1040) で com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120) で com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java: 4052) com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503) で com.mysql.jdbc.MysqlIO で。com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794) の sqlQueryDirect (MysqlIO.java:2664) com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) の com.mysql.jdbc.PreparedStatement com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) の .executeUpdate(PreparedStatement.java:2458) org.hibernate.engine の com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) で。 jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133) ... 14 件以上ビルド成功 (合計時間: 2 秒)executeUpdate(PreparedStatement.java:2458) で com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) で com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) で.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133) ... 14 件以上ビルド成功 (合計時間: 2 秒)executeUpdate(PreparedStatement.java:2458) で com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) で com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) で.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133) ... 14 件以上ビルド成功 (合計時間: 2 秒)
これから抜け出す方法を見つけるのを手伝ってください。
java - org.hibernate.ObjectDeletedException: コレクション オブジェクトに 1 対 1 の関連付けがある場合、削除されたオブジェクトはカスケードによって再保存されます
Ticket クラスに属するコレクションから TicketLine オブジェクトを削除しようとしたときに、「削除されたオブジェクトがカスケードによって再保存される」という問題が発生し、TicketLine にはクラス Reservation への OneToOne 関連付けがあります。
Tickets は、次の getter を使用して TicketLines のコレクションを定義します
クラス Reservation は、TicketLines との OneToOne 関係を次のように定義します。
TicketLine オブジェクトを ticket に追加し、Reservation オブジェクトを TicketLine オブジェクトに追加します。
期待どおりに動作します。Reservations のレコードは、resource_id フィールドのチケット ID で作成されています。
Reservation オブジェクトが関連付けられているコレクションから行を削除すると、次のエラーが発生します。
このエラーは、回線に予約が関連付けられている場合にのみ発生します。興味深いことに、新しいセッションでの 2 回目の試行は例外をスローしませんが、予約は削除されません!
TicketLines コレクションから行を削除することは、多くの場所で発生する可能性があります。つまり、予約を手動で削除することは、実際にはオプションではありません。これが Hibernate で管理できることを願っていますが、カスケード オプションに何か問題がありました。
助けてください。
java - 休止状態を使用した削除時の JPA カスケード動作を理解できません
Event、Participant、ParticipantEvent という 3 つのテーブル/エンティティがあります。ParticipantEvent は、多対多の関係の結合テーブルのようなものですが、エンティティとして作成しました。そして、マッピングは次のようになります。
イベントを削除すると、休止状態が ParticipantEvent の削除をトリガーしません。ParticipantEvent -> Participant cascade を ALL に渡すまで、外部キー制約違反エラーが発生します。これにより、ParticipantEvent で削除がトリガーされますが、Participant テーブルからもデータが削除されますが、Participant テーブルからデータを削除したくありません。
ここで迷っています。ParticipantEvent DML が Participant または Event に依存するべきではないと思います。
java - Hibernate を使用して子の削除をカスケードする方法は?
私は現在、次のような設定をしています:
最終的には違いがないので、不要なフィールドのいくつかを省略しました。さて、問題です。私がやりたいことは次のようなものです:
この関数に期待するのは、特定のコンテナーからアイテムを物理的に削除することです。 orphanRemovalをtrueに設定しているため、コンテナーを永続化すると、実際にデータベースからアイテムを削除しようとします。ここでの問題は、 foreign_key 制約を持つItemDetails エンティティにあるため、コミットが実行されているときに次のようになります。
私にとって最も紛らわしい部分は、休止状態に依存してカスケードするのではなく、データベースのfirst_item_detailsテーブルにON DELETE CASCADEを物理的に追加すると、すべてが機能することです。しかし、このアプローチはエラーが発生しやすいため、ある時点で詳細エンティティのいずれかにインターセプターまたはeventListenerを使用することを決定した場合、単に機能しないため、休止状態にする必要があるのではなく、それを処理できるようにすることをお勧めします。手動のデータベース構造の変更に依存します。
java - hibernate - 多対多の関係でカスケード型が持続する
Policy と Acl の 2 つのクラスがあります。それらには、ManyToMany 関係があります。
// ポリシー
// ACL
カスケード型を永続化として使用すると、次のエラーが発生しました。
一方、カスケード タイプをすべて使用すると、ポリシー エンティティと acl エンティティが正常に保存されます。それがどのように起こっているのか理解できません。注:保存操作を実行しているだけです。
メインコードは次のとおりです。
java - JPA と Hibernate による @manytoOne 関係の永続化
私はこの状況を持っています:
および関連エンティティ
たとえば状況で
Project_A と ProjectLeader_1 および Project_B と ProjectLeader_2
ProjectLeader_1 を Project_B に追加しようとすると、ProjectLeader_1 が Project_A から Project_B に完全に移動されるため、次のような状況になります。
Project_A with -No Leader- and Project_B with ProjectLeader_2 ProjectLeader_1
望ましい結果は次のようになります。
Project_A と ProjectLeader_1 および Project_B と ProjectLeader_2 ProjectLeader_1
プロジェクトにリーダーを割り当てる方法は次のとおりです。
これの潜在的な理由は何ですか?
私はここに新しいので、他の場所に同様の質問がある場合はリンクを投稿してください。ありがとうございました。