3

いくつかの削除操作の後に読み取りを行おうとすると、この休止状態のアサーション エラーが発生します。

この「Unable to perform un-delete」エラーに関するものは何も見つかりませんでしたが、soure code を除いて、明らかに間違ったことをしているのかもしれません...

スタック トレースは以下のとおりです。

AssertionFailure:43 -  - HHH000099: an assertion failure occured (this may indicate a bug in         Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: Unable     to perform un-delete for instance X
org.hibernate.AssertionFailure: Unable to perform un-delete for instance X
   at org.hibernate.engine.spi.ActionQueue.unScheduleDeletion(ActionQueue.java:508)
   at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:157)
   at org.hibernate.internal.SessionImpl.firePersistOnFlush(SessionImpl.java:870)
   at org.hibernate.internal.SessionImpl.persistOnFlush(SessionImpl.java:863)
   at org.hibernate.engine.spi.CascadingAction$8.cascade(CascadingAction.java:346)
   at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380)
   at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323)
   at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208)
   at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165)
   at org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:423)
   at org.hibernate.event.internal.DefaultPersistEventListener.justCascade(DefaultPersistEventListener.java:190)
   at org.hibernate.event.internal.DefaultPersistEventListener.entityIsDeleted(DefaultPersistEventListener.java:229)
   at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:158)
   at org.hibernate.internal.SessionImpl.firePersistOnFlush(SessionImpl.java:870)
   at org.hibernate.internal.SessionImpl.persistOnFlush(SessionImpl.java:863)
   at org.hibernate.engine.spi.CascadingAction$8.cascade(CascadingAction.java:346)
   at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380)
   at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323)
   at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208)
   at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165)
   at org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:423)
   at org.hibernate.event.internal.DefaultPersistEventListener.justCascade(DefaultPersistEventListener.java:190)
   at org.hibernate.event.internal.DefaultPersistEventListener.entityIsPersistent(DefaultPersistEventListener.java:183)
   at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:147)
   at org.hibernate.internal.SessionImpl.firePersistOnFlush(SessionImpl.java:870)
   at org.hibernate.internal.SessionImpl.persistOnFlush(SessionImpl.java:863)
   at org.hibernate.engine.spi.CascadingAction$8.cascade(CascadingAction.java:346)
   at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380)
   at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323)
   at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208)
   at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:409)
   at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:350)
   at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:326)
   at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208)
   at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165)
   at org.hibernate.event.internal.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:160)
   at org.hibernate.event.internal.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:151)
   at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
   at org.hibernate.event.internal.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:58)
   at org.hibernate.internal.SessionImpl.autoFlushIfRequired(SessionImpl.java:1186)
   at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1241)
   at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
   at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:257)
   at org.hibernate.ejb.criteria.CriteriaQueryCompiler$3.getResultList(CriteriaQueryCompiler.java:254)

よろしく、

4

9 に答える 9

2

私はこれと同じ問題を抱えていました。何が起こったのかというと、関連する Bean を削除していました。それらを A と B と呼びましょう。 . 私の最善の推測は、A と B の両方を参照するエンティティ D のカスケード アノテーションが、B を削除したときに As を削除し、DB レベルで既に削除されたエンティティをクエリのパラメータとして指定すると、問題が発生したことです。

最初に C から A への参照を削除し、次にB と A の両方を削除するようにコードを再配置すると、これを回避できるようです。

于 2013-06-12T09:52:51.550 に答える
1

私も今日、JPA 2.x プロバイダーとして Hibernate 4.x を使用して、同じスタック トレースに直面しました。この発生した例外を修正するために何を変更する必要があるかについて、私が学んだことは次のとおりです。

JPA でマッピングされたドメイン モデルでは、深い OneToMany ベースのグラフがあり、A には多くの B があり、B には多くの C があり、C には多くの D があり、D には多くの Es があります。すべての 1 対多のカスケード タイプは ALL です。バック ポインティング ManyToOne は各レベルに存在し、記述したコードは、これらの ManyToOne 関係がすべてデフォルトに設定された (つまり、イージー ロードされた) 場合に正常に機能しました。

私が今日診断した問題のあるユース ケースでは、JPQL クエリを使用して D の個別のセットを読み取り、そのセットを反復処理するときに EntityManager.remove(c) を呼び出します。ここで、D インスタンスに要求して c インスタンスを取得します。その親/所有者 C インスタンス。

その c インスタンスが遅延ロードされる D から C への関係によって取得された場合、EntityManager.remove(c) への呼び出しは文句を言いませんが、EntityManager.flush() への後続の呼び出しは対象の Exception になります。

その JPQL クエリ内で、「join fetch dc c」を追加することによって D から C への関係が熱心に読み込まれる場合、件名の Exception は発生しません。

したがって、他の誰かがこの問題に直面している場合に備えて、これらの結果を共有すると思いました。上記は、問題を沈黙させるために何を変更できるかを示しています。

于 2013-11-20T03:40:28.927 に答える
0

休止状態のバグである可能性があります。(プロキシインスタンスを load() ) 読み取り、 delete を呼び出して保存する場合。https://hibernate.atlassian.net/browse/HHH-8374

于 2014-01-23T22:22:50.940 に答える
0

同じエラーが発生しました。私はクラスAとBを持っていました。BにはAsのリストがあり、AにはBへの参照があります。AにはオブジェクトC(Cascade.All)への参照もあり、削除の取り消しで例外が発生します。

A のオブジェクトを B の別のオブジェクトに再配置しようとしました。

これにより、例外が発生します。

objectOfA.getObjectOfB().getListOfAs().remove(objectOfA);
objectOfB1.getListOfAs().add(objectOfA);
objectOfA.seObjectOfB(objectOfB1);

dao.flush()

これが実用的なソリューションでした。

objectOfA.seObjectOfB(objectOfB1);

dao.flush()

bjectOfA.getObjectOfB().getListOfAs().remove(objectOfA);
objectOfB1.getListOfAs().add(objectOfA);

hibernate はリロード後にこれを修正するため、最後の 2 行は必ずしも必須ではありません。

休止状態のバグかどうかはわかりません。hibernate が ActionQueue.unScheduleDeletion() で "==" を使用してオブジェクト C を同じ C のプロキシと比較するため、例外が発生しました。

于 2014-03-07T13:22:37.283 に答える