gpt4 book ai didi

java - 根据先前的值以原子方式插入或更新实体

转载 作者:行者123 更新时间:2023-12-04 05:08:23 27 4
gpt4 key购买 nike

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

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() - 但它没有考虑实体的先前状态,这在这里是必不可少的。

最佳答案

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

示例

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

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

JPA 2.0 Locking

关于java - 根据先前的值以原子方式插入或更新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15225942/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com