3

我收集了一些关于我的系统的统计数据,比如说,使用我的系统的人数和他们这一天花费的总时间。我的统计实体如下所示:

class Stats {
    Date date;
    Long numUsers; 
    Long totalTime;        
}

白天我需要根据以前的值更新这些统计信息,例如:

stats.numUsers += 1;
stats.totalTime += timeSpentByLastUser;

当然,如果今天是第一次,我需要初始化这些数据:

stats.numUsers = 1;
stats.totalTime = timSpentByFirstUserForToday; 

现在我想把它全部移到数据库中。也就是说,创建Stats一个实体并根据先前的值进行原子插入/更新。那么我该怎么做呢?我正在使用JPA,因此任何适合其模型的解决方案都将是合适的。

请注意,JPA 具有插入或更新机制EntityManager.merge()——但它没有考虑实体的先前状态,这在此处是必不可少的。

4

1 回答 1

3

是的,您通过强制用于持久性的事务锁定机制来保持原子性。

例子

Employee employee = entityManager.find(Employee.class, id);
employee.getAddress().setCity("Ottawa");
entityManager.lock(employee, LockModeType.WRITE);

请参阅下面的链接,它提供了 JPA 2.0 中可用的锁定模式

JPA 2.0 锁定

于 2013-03-05T14:45:38.923 回答