通过Hibernate更新计数器

at.*_*at. 7 mysql sql counter hibernate transactions

这是一种非常常见的情况,所以我期待一个很好的解决方案.基本上我们需要更新表中的计数器.以网页访问为例:

Web_Page
--------
Id
Url
Visit_Count
Run Code Online (Sandbox Code Playgroud)

所以在hibernate中,我们可能会有这样的代码:

webPage.setVisitCount(webPage.getVisitCount()+1);
Run Code Online (Sandbox Code Playgroud)

有问题的是默认情况下在mysql中读取不注意事务.因此,高度流量的网页会有不准确的数量.

我习惯做这种事情的方式就是调用:

update Web_Page set Visit_Count=Visit_Count+1 where Id=12345;
Run Code Online (Sandbox Code Playgroud)

我想我的问题是,我如何在Hibernate中做到这一点?其次,如何在Hibernate中进行这样的更新,这有点复杂?

update Web_Page wp set wp.Visit_Count=(select stats.Visits from Statistics stats where stats.Web_Page_Id=wp.Id) + 1 where Id=12345;
Run Code Online (Sandbox Code Playgroud)

Pas*_*ent 5

有问题的是默认情况下在mysql中读取不注意事务.因此,高度流量的网页会有不准确的数量.

确实.我会在这里使用DML样式操作(参见第13.4.DML样式操作):

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlUpdate = "update webPage wp set wp.visitCount = wp.visitCount + 1 where wp.id = :id";
int updatedEntities = s.createQuery( hqlUpdate )
        .setLong( "newName", 1234l )
        .executeUpdate();
tx.commit();
session.close();
Run Code Online (Sandbox Code Playgroud)

哪个应该导致

update Web_Page set Visit_Count=Visit_Count+1 where Id=12345;
Run Code Online (Sandbox Code Playgroud)

其次,如何在Hibernate中进行这样的更新,这有点复杂?

嗯......我很想说"你被搞砸了"......需要多考虑一下这个问题.