java - 在 Hibernate 4 和 Postgres 中使用 "SELECT FOR UPDATE OF"

标签 java hibernate postgresql hibernate-mapping

我正在使用 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' 是主类的joined-subclass

<class name="BaseObject" table="BASE_OBJECTS">

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

升级到 4.3.1.1 后,相同的查询返回上述异常。 这意味着最终查询执行为for update(没有执行锁定的表的名称)

在广泛查看网络后,我发现 Postgres hibernate 中的“for update of”不再受支持?

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

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

我是不是漏掉了什么?

02.09.15:

我会试着澄清自己:

使用 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>

如果我想执行类似的操作: select p from Payment p where id=1

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

添加锁 (.setLockMode(LockMode.PESSIMISTIC_WRITE)) 将锁定四个表上的行(作为'For update'), 而不是仅在表“付款”上(“用于更新 p”)——这确实发生在 hibernate 3.2 中

那么我们所拥有的,是不是之前由 hibernate 提供的 Something 不再工作,使用他们自己的映射示例?

提前致谢 jetty

最佳答案

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

关于java - 在 Hibernate 4 和 Postgres 中使用 "SELECT FOR UPDATE OF",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32327782/

相关文章:

python - 在 Python 中的 psycopg2 中执行 .sql 模式

postgresql - 连接到在Docker中运行的postgres时出错:pq:用户“postgres”的密码身份验证失败

Java try catch 最后似乎毫无意义

java - 格式化字符串的最简洁方法

java - 在 Hibernate 中使用 Load() 加载任意对象

java - 获取 hibernate 中实体的最后一个ID

java - 生产者消费者使用等待和通知: Consumer does not receive messages

java - XML Dom 处理

java - 拥有一方的真正含义是什么?

python - sqlalchemy:停止长时间运行的查询