基于先前值以原子方式插入或更新实体

时间:2013-03-05 14:11:13

标签: java jpa

我收集了一些关于我的系统的统计数据,比方说,使用我的系统的人数和他们今天花的总时间。我的统计实体看起来像这样:

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() - 但它没有考虑实体的先前状态,这在此非常重要。

1 个答案:

答案 0 :(得分:3)

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

示例

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

请参阅以下链接,该链接提供JPA 2.0中可用的锁定模式

JPA 2.0 Locking