休眠:增加整数字段

3ur*_*och 10 sql-server hibernate hql

我想使用Hibernate将数据库表中的字段增加1.

我可以通过简单地加载一个对象,增加值和更新但对象如果另一个线程来临时,在负载和更新则该值将损坏之间更新的领域做到这一点.

所以我直接在数据库上调用了更新:

Query updateHits = createQuery(
    "UPDATE Job SET hitCount = hitCount + 1 WHERE id = :jobId" );
updateHits.setInteger( "jobId", job.getId() );
updateHits.executeUpdate();
Run Code Online (Sandbox Code Playgroud)

但是我的理解是,这绕过了数据库中的乐观锁定,我目前遇到了SQL服务器死锁的问题,我相信这是罪魁祸首.

有没有办法在不调用更新的情况下增加字段并保持数据完整性?

Luc*_*ira 4

我可以通过简单地加载一个对象、增加值并更新对象来做到这一点,但是如果另一个线程出现并更新加载和更新之间的字段,那么该值将被损坏。

如果第二个线程也在使用 hibernate 并且您正在使用 hibernate 版本控制 (@Version),则第一个提交并更改对象的线程将在对象上设置新版本。

当第二个线程提交进来时,hibernate 将检查乐观锁是否失败,并抛出一个异常 - 如果我没有记错的话,会抛出 StaleObjectException 。如果您的并发代码周围有一个 catch 块,您将有机会再次加载该对象并尝试更新(如果有意义)。如果您使用 JPA,将会抛出 OptimisticLockException。

Hibernate 乐观并发控制部分有大量信息。

干杯!