我有两个对象:

public class ParentObject {
 // some basic bean info
}

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

这些表格中的每一个相当于一个目前存在数据库中的表。我使用的休眠查询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 ");

这是所有基本休眠的东西。然而,本部分,我具有的问题是,我需要申请锁的所有表格的查询。

我可以锁定类型儿童的对象使用的查询。setLockType("儿童"、LockMode.?).然而,我似乎无法找到一种方法的地方锁定在父母表。

我是新来的冬眠,我仍然工作的一些心理障碍。问题是:我可以如何地方锁定在父母表吗?

我想知道,如果有办法解决具有做到这一点没有撤消的多形态结构,我已经设立。

有帮助吗?

解决方案

你为什么要锁定这两个表?我问是因为这取决于你想要什么做可能有替代方案来实现的,你想要什么。

事情的方式、休眠正常 只有锁的根源表 除非你使用一些外来的数据库/方言。因此,机会是你已经锁定你的 ParentObject 表,而不是 ChildObject.

更新 (根据的评论):

因为你使用一种异国情调的数据库:-),其并不支持 FOR UPDATE 语法、休眠是锁定的"主要"的表格作为他们指定的查询("主要"在这种情况下正在表映射的实体列出的 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();
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top