我有两个对象:
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 ");
这都是基本的 hibernate 内容。但是,我遇到问题的部分是我需要对查询中的所有表应用锁。
我可以使用query.setLockType("child", LockMode.?) 设置子对象的锁定类型。但是,我似乎找不到在父表上放置锁的方法。
我是 Hibernate 新手,并且仍在解决一些心理障碍。问题是:如何在父表上加锁?
我想知道是否有一种方法可以在不撤消我设置的多态结构的情况下完成此操作。
最佳答案
为什么必须锁定两个表?我这样问是因为根据您想要做什么,可能有替代解决方案来实现您想要的目标。
事情是这样的, hibernate 正常only locks the root table除非您使用一些外来数据库/方言。因此,您很可能已经锁定了 ParentObject
表,而不是 ChildObject
。
更新(基于评论):
由于您使用的是不支持 FOR UPDATE
语法的外来数据库:-),Hibernate 会锁定查询中指定的“主”表(在本例中,“主”表是为 FROM
子句中列出的实体映射的表,而不是层次结构的根 - 例如 ChildObject
,而不是 ParentObject
)。由于您想锁定两个表,我建议您尝试以下操作之一:
- 从查询中获取实体后,对实体调用
session.lock()
。这应该锁定层次结构的根表,但是我不能 100% 确定它是否有效,因为从技术上讲,您正在尝试“升级”已在给定实体上持有的锁。 尝试通过在查询中显式命名
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();
关于java - Hibernate - 在多态查询中将锁应用于父表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1787224/