休眠:增加整数字段

时间:2011-03-25 10:55:53

标签: 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();

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

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

1 个答案:

答案 0 :(得分:4)

  

我可以通过简单地加载一个来完成   对象,递增值和   然而,如果另一个更新对象   线程出现并更新   在负载和之间的字段   更新然后值将成为   损坏。

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

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

Hibernate Optimistic Concurrency Control Section上有大量信息。

干杯!