加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:09:22 所属栏目:Java 来源:网络整理
导读:我正在使用Postgres 9.3.5并且最近将hibernate从3.2更新到4.3.11. 结果我无法运行“SELECT … FOR UPDATE OF”查询, 而且只是’select .. for update’在我的情况下是不够的,因为它返回 could not extract ResultSet. Reason: ERROR: FOR UPDATE cannot be a
我正在使用Postgres 9.3.5并且最近将hibernate从3.2更新到4.3.11.

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

could not extract ResultSet. Reason: ERROR: FOR UPDATE cannot be applied to the nullable side of an outer join

我试图使用的标准如下:

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后,同一查询返回上述异常.
这意味着为更新执行的最终查询(没有要执行锁定的表的名称)

经过广泛的网络浏览后,我发现只有不再支持hibernate与Postgres的“for update of”了吗?

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

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

我在这里错过了什么吗?

15年9月2日:

我会尽力澄清自己:

使用hibernate文档中给出的示例

07001

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提供的东西,不再使用它们自己的映射示例了吗?

提前致谢
码头

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读