1

我有两个对象:

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>

我可以使用休眠来毫无问题地查询这两个表。

我用

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

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

我可以使用 query.setLockType("child", LockMode.?) 设置子对象的锁定类型。但是,我似乎找不到在父表上加锁的方法。

我是 Hibernate 的新手,并且仍在解决一些心理障碍。问题是:如何在父表上加锁?

我想知道是否有办法在不撤消我设置的多态结构的情况下做到这一点。

4

1 回答 1

1

为什么你必须锁定两个表?我之所以问,是因为根据您要尝试做的事情,可能会有替代解决方案来实现您想要的。

事情就是这样,Hibernate 通常只锁定根表,除非您使用一些异国情调的数据库/方言。所以,很可能你已经锁定了你的ParentObject桌子,而不是ChildObject.

更新(基于评论):

由于您使用的是不支持FOR UPDATE语法的外来数据库:-),因此 Hibernate 将锁定“主”表,因为它们在查询中指定(在这种情况下,“主”表是为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 回答