我正在使用 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/