A具有JPA实体,该实体具有时间戳字段并且由复杂标识符字段区分.我需要的是更新已经存储的实体中的时间戳,否则使用当前时间戳创建和存储新实体.
事实证明,任务并不像第一眼看上去那么简单.问题是在并发环境中我遇到了令人讨厌的"唯一索引或主键冲突"异常.这是我的代码:
// Load existing entity, if any.
Entity e = entityManager.find(Entity.class, id);
if (e == null) {
// Could not find entity with the specified id in the database, so create new one.
e = entityManager.merge(new Entity(id));
}
// Set current time...
e.setTimestamp(new Date());
// ...and finally save entity.
entityManager.flush();
Run Code Online (Sandbox Code Playgroud)
请注意,在此示例中,实体标识符不会在插入时生成,因此事先已知.
当两个或多个线程并行运行此代码块时,它们可能同时null从entityManager.find(Entity.class, id)方法调用中获取,因此它们将尝试同时保存两个或多个实体,并使用相同的标识符导致错误.
我认为解决问题的方法很少.
MERGE声明,即更新现有或创建新行(如果不存在).但我怀疑OpenJPA(我选择的JPA实现)是否支持它.请帮忙.
| 归档时间: |
|
| 查看次数: |
10384 次 |
| 最近记录: |