我正在使用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提供的东西,使用他们自己的映射示例不再起作用了吗?
提前致谢 码头
答案 0 :(得分:0)
问题已在Hibernate 5中修复。 在5.2.8.Final中测试。