hibernate:在两个请求中选择更新

时间:2018-05-04 14:44:48

标签: java hibernate jpa

在我的springBoot项目中,我正在使用hibernate在我的oracle数据库上获取lock

在我的交易中,我执行以下代码:

Query q = em.createQuery("SELECT m FROM myTablem WHERE foo= :cat");
q.setParameter("cat", myValue);
q.setMaxResults(1);

//use pessimistic lock
//With Oracle, the select is a 'select for update' request
q.setLockMode(LockModeType.PESSIMISTIC_WRITE);

//set hibernate timeout to 0
//With Oracle, the 'select for update' is transformed in 'select for update nowait'
q.setHint("javax.persistence.lock.timeout", 0);

List<Msisdn> msisdns = q.getResultList();

我想在我的数据库上执行"select for update"。 但是使用这段代码,hibernate会执行两个请求:

  

Hibernate :select * from(select my from myTablem m cross join categorie_critere categoriec1_ where m.foo = ...)其中rownum&lt; =?

     

Hibernate :从m中选择ce_code_abpq,其中idpk1 =?和idpk2 =?和idpk3 =?用于更新nowait

在第一个请求中,hibernate执行select请求。在第二个请求中,休眠在所选元素上调用"select for update"

是否可以选择仅在一个请求中执行"select for update"

此致 塞德里克

1 个答案:

答案 0 :(得分:1)

禁用后续锁定:

  1. 升级到Hibernate 5.2.1
  2. 将数据库升级到12c并使用Oracle12cDialect,或将HINT_FOLLOW_ON_LOCKING查询提示设置为false
  3. 有关详细信息,请参阅here