1

私は2つのオブジェクトを持っています:

public class ParentObject {
 // some basic bean info
}

public class ChildObject extends ParentObject {
 // more bean info
}

これらの各テーブルは、データベース内の別のテーブルに対応しています。Hibernate を使用して ChildObject をクエリしています。これにより、親オブジェクトの値が入力されます。

マッピング ファイルを次のように定義しました。

<hibernate-mapping>
<class name="ParentObject"
       table="PARENT_OBJECT">
   <id name="id"
       column="parent"id">
      <generator class="assigned"/>
   </id>
   <property name="beaninfo"/>
   <!-- more properties -->
   <joined-subclass name="ChildObject" table="CHILD_OBJECT">
       <key column="CHILD_ID"/>
       <!--properties again-->
   </joined-subclass>
</class>
</hibernate-mapping>

休止状態を使用して、2 つのテーブルを問題なくクエリできます。

私が使う

session.createQuery("from ChildObject as child ");

これはすべて基本的な休止状態のものです。ただし、私が問題を抱えている部分は、クエリ内のすべてのテーブルにロックを適用する必要があることです。

query.setLockType("child", LockMode.?) を使用して、子オブジェクトのロック タイプを設定できます。ただし、親テーブルにロックを設定する方法が見つからないようです。

私は Hibernate を初めて使用し、まだいくつかの精神的な障害に取り組んでいます。問題は、親テーブルをロックするにはどうすればよいかということです。

私が設定したポリモーフィック構造を元に戻さずにこれを行わなければならないことを回避する方法があるかどうか疑問に思っていました.

4

1 に答える 1

1

なぜ両方のテーブルをロックする必要があるのですか?あなたがやろうとしていることに応じて、あなたが望むことを達成するための代替の解決策があるかもしれないので、私は尋ねています。

ちなみに、Hibernateは通常、エキゾチックなデータベース/方言を使用していない限り、ルートテーブルのみをロックします。したがって、おそらく、ParentObjectではなくテーブルをすでにロックしている可能性がありますChildObject

更新(コメントに基づく):

構文をサポートしないエキゾチックなデータベースを使用しているため:-) FOR UPDATEHibernateは、クエリで指定されている「プライマリ」テーブルをロックしています(この場合、「プライマリ」は、FROM句にリストされているエンティティにマップされたテーブルであり、階層のルート-たとえばChildObject、ではありませんParentObject)。両方のテーブルをロックしたいので、次のいずれかを試してみることをお勧めします。

  1. クエリからエンティティを取得した後、エンティティを呼び出しsession.lock()ます。これにより、階層のルートテーブルがロックされますが、技術的には、特定のエンティティで既に保持されているロックを「アップグレード」しようとしているため、機能するかどうかは100%わかりません。
  2. ParentObjectクエリでテーブルに明示的に名前を付け、そのロックモードを要求して、ごまかしてみてください。

    String hql = "select c from ChildObject c, ParentObject p where c.id = p.id";
    session.createQuery(hql)
     .setLockMode("c", LockMode.READ)
     .setLockMode("p", LockMode.READ).list();
    
于 2009-11-24T03:35:55.430 に答える