使用“SELECT FOR UPDATE OF”和Hibernate 4& Postgres的

时间:2015-09-01 09:15:56

标签: java hibernate postgresql hibernate-mapping

我正在使用Postgres 9.3.5并且最近将hibernate从3.2更新到4.3.11。

因此我无法运行“ SELECT ... FOR UPDATE OF ”查询, 并且只是'select .. for update'在我的情况下是不够的,因为它返回

  

无法提取ResultSet。原因:错误:FOR UPDATE无法应用于外连接的可空区域

我尝试使用的标准如下:

 Criteria criteria = session.createCriteria(objectType).add(Restrictions.eq("name", objectName).ignoreCase());

我正在使用以下锁定:

3.2中的

:criteria.setLockMode(LockMode.UPGRADE);

4.3.11中的

:criteria.setLockMode(LockMode.PESSIMISTIC_WRITE);

我有一个hibernate(& DB)对象的层次结构,这会导致hibernate在构造上述查询时执行多个连接。 'objectType'是主类

连接子类
<class name="BaseObject" table="BASE_OBJECTS">

在使用hibernate 3.2时,最终查询(取自Postgres日志)以:“更新this_2 _ ”结束 (当 this_2 _ 是hibernate给hbm.xml文件中映射的主表(BaseObject)的别名时)

升级到4.3.1.1后,同一查询返回上述异常。 这意味着最终查询以进行更新执行(没有要执行锁定的表的名称)

经过广泛的网络浏览后,我发现只有不再支持使用Postgres进行hibernate的“更新”了吗?

[https://hibernate.atlassian.net/browse/HHH-5654][2]

这似乎不太可能,因为它是一个非常重要的sql功能,并且使用率大幅下降。

我在这里遗漏了什么吗?

15年9月2日

我会尽力澄清自己:

使用hibernate文档中给出的示例 在

  

https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/inheritance.html

class name="Payment" table="PAYMENT">
<id name="id" type="long" column="PAYMENT_ID">
    <generator class="native"/>
</id>
<property name="amount" column="AMOUNT"/>
...
<joined-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">
    <key column="PAYMENT_ID"/>
    <property name="creditCardType" column="CCTYPE"/>
    ...
</joined-subclass>
<joined-subclass name="CashPayment" table="CASH_PAYMENT">
    <key column="PAYMENT_ID"/>
    ...
</joined-subclass>
<joined-subclass name="ChequePayment" table="CHEQUE_PAYMENT">
    <key column="PAYMENT_ID"/>
    ...
</joined-subclass>

如果我想执行以下操作: 从付款p中选择p,其中id = 1

Hibernate将在所有表上执行外连接(在键上)。

添加锁( .setLockMode(LockMode.PESSIMISTIC_WRITE))将锁定四个表上的行(如“For update”), 而不只是在表“付款”('更新p') - 这确实发生在hibernate 3.2

那么我们拥有的是,早期由hibernate提供的东西,使用他们自己的映射示例不再起作用了吗?

提前致谢 码头

1 个答案:

答案 0 :(得分:0)

问题已在Hibernate 5中修复。 在5.2.8.Final中测试。