代码之家  ›  专栏  ›  技术社区  ›  bogertron

休眠-在多态查询中对父表应用锁

  •  1
  • bogertron  · 技术社区  · 16 年前

    我有两个对象:

    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>
    

    我可以使用hibernate查询这两个表而不发出任何问题。

    我用

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

    这是所有基本的冬眠用品。但是,我遇到的问题是,我需要对查询中的所有表应用锁。

    我可以使用query.setLockType(“child”,lockMode.)为子对象设置锁类型。。但是,我似乎找不到在父表上放置锁的方法。

    我刚开始冬眠,现在仍在解决一些心理障碍。问题是:如何在父表上放置锁?

    我想知道是否有一种方法可以在不破坏我所建立的多态结构的情况下实现这一点。

    1 回复  |  直到 16 年前
        1
  •  1
  •   ChssPly76    16 年前

    你为什么要锁两张桌子?我问的是,根据你想做什么,可能会有其他的解决方案来实现你想要的。

    事情是这样的,正常的冬眠 only locks the root table 除非你用的是外来的数据库/方言。所以,很可能你已经锁定了 ParentObject 表而不是 ChildObject .

    更新 (基于评论):

    因为您使用的是一个异域数据库:-)它不支持 FOR UPDATE 语法,hibernate按查询中指定的方式锁定“primary”表(“primary”在本例中是为中列出的实体映射的表)。 FROM 子句,而不是层次结构的根-例如 儿童对象 不是 父对象 )既然您想锁定这两个表,我建议您尝试以下方法之一:

    1. 呼叫 session.lock() 在从查询中获取实体之后。这应该锁定 但是,层次结构的表,我不能100%确定它是否能工作,因为从技术上讲,您正试图“升级”一个给定实体上已经持有的锁。
    2. 试图通过明确命名来欺骗 父对象 查询中的表并为其请求锁模式:

      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();