我收集了一些关于我的系统的统计数据,比方说,使用我的系统的人数和他们今天花的总时间。我的统计实体看起来像这样:
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()
- 但它没有考虑实体的先前状态,这在此非常重要。
答案 0 :(得分:3)
是的,通过强制用于持久性的事务锁定机制来保持原子性。
示例
Employee employee = entityManager.find(Employee.class, id);
employee.getAddress().setCity("Ottawa");
entityManager.lock(employee, LockModeType.WRITE);
请参阅以下链接,该链接提供JPA 2.0中可用的锁定模式