Hibernate joined-subclass更新

基本クラス A と2つのサブクラス B C を持っています。私は B のインスタンスを持っていますが、これを更新して型を C に変更しようとしています。更新されたデータを含む C のインスタンスは一時的なものです。なぜなら、永続的なインスタンスを変更することはできないと想像できないからです。

一時インスタンスがフロントエンドからサービスレイヤに渡されると、セッションが開始され、有効な操作であることを確認するためにいくつかのチェックが行われます。このセッション中に、永続インスタンス( B )が取得されます。すべてがチェックアウトされていると仮定すると、一時オブジェクトは永続化されています。

あたかも .merge()が呼び出す正しいメソッドだと思われますが、 .update()を呼び出すかのようにNonUniqueObjectExceptionが発生します(これはうまくいかない永続インスタンスが現在セッションに入っているので、そうしないでください)。

私は .merge()がこのような状況を想定しているので、なぜ .merge()がNonUniqueObjectExceptionを与えているのか分かりません。セッションに存在するエンティティを一時的なインスタンスで更新しようとしています。 私の推測は、永続インスタンスが一時インスタンスとは異なるクラスであったことがうんざりしていたことでした。私はテストしました。同じクラスの一時的なインスタンスで .merge()を呼び出すと、すべてが正常に動作します。

次に何をすべきかわからないので、永続インスタンスの .evict()を実行してから、一時的なインスタンスの .update()を試みましたが、StaleObjectExceptionが発生します。この時点で、私は解決策を思いつくことはできません。私たちは何かばかげたことをしようとしているのか、何らかの構成上の問題がありますか?

1

1 答え

Javaや休止状態ではこれを行うことはできません。これは、データベース内の直接SQLクエリ(休止状態を回避)によってのみ可能です。休止状態で行う必要があるのは、 B を削除して新しい C を作成することです。あなたはすべての参照と関係(明らかに A に存在していた)を手作業で処理する必要があります。 C には新しいIDが割り当てられます( Aに自動インクリメントIDなどがある場合)。

0
追加された
だから問題は、サブクラスを変更することです?私はそれがサポートされていないことを少し失望しています。
追加された 著者 Nick Spacek,
はい。とにかくJavaでこれをどうやって行うことができますか?それはいけません。
追加された 著者 cherouvim,