問題タブ [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.
hibernate - CascadeType.ALLを使用する場合のHibernateで、最上位エンティティを保存すると、関連するエンティティに不必要な更新が発生します
@OneToManyを別のエンティティ(CoverArt)にマッピングするエンティティクラス(Song)を用意し、メインエンティティを保存してカバーアートの永続化を処理する方が簡単なように見えるため、カスケードをALLに設定します。
しかし、コードの後半で、データベースからクラスのインスタンスを取得し、セッション内でSongエンティティの1つのフィールドだけを変更すると、その曲にリンクされているすべてのカバーアートエンティティが更新されることがわかりました。カバーアートは何も変わっていませんが、なぜこれをしているのですか?
また、それが問題を引き起こすとは思わないが、私はEnversを使用しており、CoverArtテーブルへの(一見)不必要な追加の更新は、Enversに不要な監査テーブルを作成させるというノック効果もあります。
1つのフィールドを変更するCascadeTypeアノテーションを削除しても、カバーアートエンティティは更新されず、カバーアートを追加するときに追加のロジックを追加する限り、すべてが正常に機能しますが、必要がないことを望んでいました。これ。
java - Hibernate 4 および ManyToOne カスケードでの IllegalStateException
私はそれらの2つのクラスを持っています
MyItem オブジェクト:
コンポーネント オブジェクト:
そして、私は次のコードでそれらを永続化しようとしています:
これは Hibernate 3.6 では問題なく動作しますが、Hibernate 4.1.3 ではスローされます。
データベースのバックエンドは h2 です (ただし、hsqldb または derby でも同じことが起こります)。私は何を間違っていますか?
java - 休止状態のマージでデータが失われる
Hibernate とマージで奇妙な問題が発生しています。
問題のクラスの構造は次のようになります。
したがって、基本的には、CaseWorkerA への参照を含む Project クラスがあります。これは、CaseWorker のサブクラスであり、これも User のサブクラスです。
コード内:
次に、ユーザー階層があります。
次に、プロジェクトを保存するための Dao クラスのメソッドがあります。
さて、問題は次のとおりです。
Dao メソッドは、データベースに存在するプロジェクトを受け取ります。このプロジェクトは、ステータスが CaseWorkerStatus.ACTIVE である CaseWorkerA に接続されています (データベースと着信オブジェクトの両方で)。しかし、マージ後、ケースワーカーのステータスは null になります。
格納されるオブジェクトと同様に、値はデータベースでも同じであるため、マージ後も同じままであると予想されます。
(このフィールドのデータベースにはトリガーがありません..)
(代わりに saveOrUpdate を使用するように dao-method を変更しようとしていますが、これで問題が解決したとしても、そもそも何が原因なのか知りたいと思っています)。
アップデート:
そこで、デバッガーをいじってみたところ、次のことがわかりました。 問題の CaseWorker のセッションを照会したところ、ステータス フィールドが設定された状態で表示されました (実際、返されたオブジェクトは、プロジェクトに接続されていたものとまったく同じでした)。
saveOrUpdate を実行してから get を実行すると、ステータス フィールドが設定された CaseWorker が生成されました。ということで、マージ方法に問題がありそうです..
java - JPAカスケードアノテーションとHibernateカスケードアノテーションの違い
私はHibernateアノテーションを実際に試してみました。カスケードを使用しようとすると、Eclipseインテリセンスで2つのオプションが表示されます。
Hibernate CascadeTypeには、JPAのものよりも多くのオプションがあります。
お互いに利点はありますか?
java - Hibernate で親子オブジェクトを削除する際の問題「削除されたオブジェクトはカスケードによって再保存されます」
次の 2 つのエンティティがあります。
1-ディール
2-DealCheckList
実行中session.delete(deal)
に以下のエラーが発生します
助けてください。
java - Hibernate で子オブジェクトを削除する際の問題「削除されたオブジェクトはカスケードによって再保存されます」
次の 2 つのエンティティがあります。
1-ディール
2-DealCheckList
子オブジェクトの削除中、つまり DealCheckList を使用して
以下のエラーが表示されます
助けてください。
hibernate - 変更されていないコレクションのオブジェクトへのHibernateカスケード更新
Hibernate 3.3、JPA 1.x、およびHsqldb1.8を使用する
他のオブジェクトのコレクションを含むオブジェクトへのカスケード更新に問題があります。これは、説明するために考案された(わずかに)例です(ゲッター/セッターは省略)。申し訳ありませんが、コードがたくさんあります。問題を表現する別の方法を見つけることができず、すべてがここでかなり簡単です。
したがって、セールスマンには会社ごとに一連の連絡先があり、会社にサービスを提供するセールスマンが多数いて、それぞれが異なる連絡先を持っている場合があります。新しい会社(および関連する連絡先)をセールスマンに追加できます。すべて問題ありません。
この問題は、すでにいくつかの会社を持っているセールスマンに新しい会社(および連絡先)を追加するときに発生します。
これをhibernate.show_sql=trueで実行すると、各連絡先に対して挿入を実行し、新しい連絡先セットに対して挿入を実行するという期待される効果があることがわかります。また、セールスマン自体の更新と、問題のセールスマンが持っている他のすべてのContactSetおよびContactの更新も表示されます。セールスマンごとに数千の連絡先があるため、このトランザクションには長い時間がかかります。
私の質問は、変更されていないことがわかっているContactSetsとContactsのすべての更新を回避するにはどうすればよいですか?@Versionタグを追加し、CascadeTypeを変更して(私のアプリケーションではALL以外はすべて失敗します)、より具体的なコードをいじくり回してみましたが、成功しませんでした。
ポインタを事前に感謝します、
**編集:session.lock(salesman、LockMode.NONE)をトランザクションに追加すると、他のオブジェクトは更新されませんが、コードはまだ低速であることがわかりました。まだ何千ものオブジェクトをセッションに追加してそれらをロックしているので、私は疑っています。これを反映するようにサンプルコードを更新しました。LockMode.NONEは、切り離されたオブジェクトをセッションに再関連付けするだけです。
フィル
hibernate - Hibernate は、更新後に多対多関連テーブルからレコードを削除します
私のチームワーク指向のアプリでは、ユーザーとチームの間に多対多の関係があるため、休止状態は関連付けテーブルを作成します。問題は、チームを持つユーザーを更新した後、hibernate が対応する関連付けレコードを USER_TEAM テーブルから削除することです。
ユーザー エンティティ:
チーム エンティティ:
ログは次のとおりです。
INFO: 20.11.2012 22:50:00,170 DEBUG org.hibernate.transaction.JDBCTransaction.begin: begin
INFO: 20.11.2012 22:50:00,175 DEBUG org.hibernate.transaction.JDBCTransaction.begin: 現在の autocommit ステータス: true
INFO: 20.11.2012 22:50:00,175 DEBUG org.hibernate.transaction.JDBCTransaction.begin: 自動コミット
情報を無効にします: 20.11.2012 22:50:00,175 DEBUG hibernate.jdbc.util.SQLStatementLogger.logStatement: user_.EMAIL、user_.GROUPNAME を選択しますGROUPNAME0_ として、user_.NAME を NAME0_ として、user_.PASSWORD を PASSWORD0_ として USERS から user_ where user_.EMAIL=?
情報: 休止状態: user_.EMAIL、user_.GROUPNAME を GROUPNAME0_ として、user_.NAME を NAME0_ として、user_.PASSWORD を PASSWORD0_ として USERS user_ から選択します。user_.EMAIL=?
情報: 20.11.2012 22:50:00,176 TRACE type.descriptor.sql.BasicBinder.bind: パラメーター [1] を [VARCHAR] としてバインド - a@b.com
情報: 20.11.2012 22:50:00,177 TRACE type.descriptor .sql.BasicExtractor.extract: 列 [GROUPNAME0_] として [ユーザー] が見つかりました
情報: 20.11.2012 22:50:00,178 TRACE type.descriptor.sql.BasicExtractor.extract: 列 [NAME0_] として [デフォルト] が見つかりまし
た2012 22:50:00,178 トレース type.descriptor.sql.BasicExtractor.extract: [デフォルト] 列 [PASSWORD0_]
情報として見つかりました: 20.11.2012 22:50:00,251 DEBUG org.hibernate.transaction.JDBCTransaction.commit: コミット
情報: 20.11.2012 22:50:00,252 DEBUG hibernate.jdbc.util.SQLStatementLogger.logStatement: ユーザーを更新します GROUPNAME=?, NAME=?, PASSWORD=? メールアドレス=?
INFO: Hibernate: update USERS set GROUPNAME=?, NAME=?, PASSWORD=? メールアドレス=?
情報: 20.11.2012 22:50:00,260 TRACE type.descriptor.sql.BasicBinder.bind: パラメーター [1] を [VARCHAR] としてバインド - ユーザー
情報: 20.11.2012 22:50:00,261 TRACE type.descriptor.sql.BasicBinder .bind: パラメータ [2] を [VARCHAR] としてバインド - andy
INFO: 20.11.2012 22:50:00,261 TRACE type.descriptor.sql.BasicBinder.bind: パラメータ [3] を [VARCHAR] としてバインド - ブレーク
INFO: 20.11. 2012 22:50:00,262 TRACE type.descriptor.sql.BasicBinder.bind: パラメーター [4] を [VARCHAR] としてバインド - a@b.com
INFO: 20.11.2012 22:50:00,264 DEBUG hibernate.jdbc.util.SQLStatementLogger .logStatement: EMAIL=? の USER_TEAM から削除します。
情報: 休止状態: EMAIL=? の USER_TEAM から削除します
情報: 20.11.2012 22:50:00,271 TRACE type.descriptor.sql.BasicBinder.bind: パラメーター [1] を [VARCHAR] としてバインド - a@b.com
情報: 20.11.2012 22:50:00,274 DEBUG
org.hibernate .transaction.JDBCTransaction.toggleAutoCommit: 自動コミット情報を再度有効にしています: 20.11.2012 22:50:00,274 DEBUG org.hibernate.transaction.JDBCTransaction.commit: JDBC 接続をコミットしました
更新操作は、Spring の hibernateTemplate によって、UserDAO のこの単純なメソッドで提供されます。
(hibernateTemplate を使用すべきではないことはわかっていますが、それはこの問題のポイントではないと思います)
また、DAO メソッドは、Spring サービス Bean UserServiceImpl によってトランザクションで呼び出されるだけです。
ご覧のとおり、カスケード注釈はありません。もちろん、更新時にユーザー (EMAIL) の PK を変更していないため、この動作がわかりません。春の 3.1.0.RELEASE と休止状態の 3.6.10.Final を使用しています。
提案や説明をありがとう。
java - 1対1で削除:Hibernate 3 + Spring 3 + PostgreSQL 9.1
これは私の最初の投稿であり、Hibernate+Springは初めてです。applicationContext.xmlファイルでHibernateマッピング宣言にXMLを使用しています。
簡単に言えば、私はやろうとしています:
それが子供を削除することを期待して。しかし、それは機能しません。:(
代わりに、私はこの例外を持っています:
原因:org.hibernate.engine.Engine.Engine.Cascadeのorg.hibernate.engine.Cascade.cascadeProperty(Cascade.java:232)のorg.hibernate.engine.EntityEntry.getLoadedValue(EntityEntry.java:255)のjava.lang.NullPointerException .cascade(Cascade.java:161)at org.hibernate.engine.Cascade.cascade(Cascade.java:127)at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:376)atorg.hibernate。 event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:350)at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246)at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java: 57)org.hibernate.event.defで。DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:742)at org.hibernate.impl.SessionImpl.update(SessionImpl.java:730)at org.hibernate.impl .SessionImpl.update(SessionImpl.java:722)at org.springframework.orm.hibernate3.HibernateTemplate $ 14.doInHibernate(HibernateTemplate.java:708)at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:705)at org.springframework.orm.hibernate3.HibernateTemplate.update (HibernateTemplate.java:701)fr.gouv.travail.gestionAccords.server.daoで。実装.DossierDAOImpl.update(DossierDAOImpl.java:163)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke java:25)at java.lang.reflect.Method.invoke(Method.java:597)at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)at org.springframework.aop.framework.ReflectiveMethodInvocation .invokeJoinpoint(ReflectiveMethodInvocation.java:183)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)atorg。 springframework.aop。framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)at $ Proxy38.update(Unknown Source)at fr.gouv.travail.gestionAccords.server .business.gestionDossiers.detailsDossier.commons.implementations.DetailsDossierBusinessImpl.update(DetailsDossierBusinessImpl.java:396)
XMLマッピングファイルで宣言する必要があることを確認しdelete-orphan
ましたが、機能したくないので気が狂います。何が悪いのか見ていただけませんか?
したがって、現在のプロジェクトでは、1対1の関係があります。これがDossierBeanという親のXMLマッピングです。
DossierBean.hbm.xml
TravailleurHandicapeBean.hbm.xml
DossierBean.java(親Bean):
TravailleurHandicapeBean.java(子Bean):
ご協力いただきありがとうございます!
答えはありませんか?あなたの貢献に感謝します...
java - 非永続オブジェクトとの Hibernate カスケード マージ
私のプロジェクトには次の構造があります。
次に、切り離された A オブジェクトがあり、切り離された B オブジェクトへの参照があり、そのオブジェクトが切り離された C オブジェクトへの参照を持ち、それがいくつかの D オブジェクトへの参照を持っているシーンです。(私は JMS を使用しているので、それらは本当に切り離されています)。このような:
ここで、分離された A は A のデータベース表現とマージされます。B と C についても同様ですが、C から D への新しい参照はどうなるでしょうか? c_d 接続テーブルには何も保存されていませんが、その理由がわかりません。Hibernate/JPA の制限によるものですか、それとも設定に関して何か不足していますか?
アップデート:
デバッガーを使用することで、C オブジェクトに対して明示的な getSession().merge() を実行でき、D への参照がデータベースに格納されました。Hibernate cascade がこれを処理しない理由はまだよくわかりませんが、掘り続けます。