首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找出在使用Spring数据时是否要插入副本?

如何找出在使用Spring数据时是否要插入副本?
EN

Stack Overflow用户
提问于 2017-04-06 21:13:47
回答 2查看 2.4K关注 0票数 1

库.Spring-数据-JPA,Java 8,JUnit-4 (用于测试)

我有一个实体,我们叫它Semaphore。有多台机器试图创建相同的Semaphore行。我们只想让其中一个成功。下面是发生的事情-

  1. Semaphore行有一个主键,始终是1。
  2. 机器A创建信号量并使用Spring save将其保存到DB
  3. 机器B认为它也在创建信号量,并调用save,但最终更新了它,而客户端代码却不知道它。我可以检查exists,但这并不能保证任何东西,因为这两台机器都可以在创建记录之前进行检查。
  4. 在完成加工后,赢得插入的机器将把桌子清理干净。

除了直接使用实体管理器来查看实体是否是新实体之外,我们还有什么选择?本质上覆盖Spring数据保存方法。

我们使用Oracle作为DB。

对于每个人的现成参考,这里是Spring的SimpleJpaRepository保存方法。

代码语言:javascript
复制
@Transactional
public <S extends T> S save(S entity) {
    if(this.entityInformation.isNew(entity)) {
        this.em.persist(entity);
        return entity;
    } else {
        return this.em.merge(entity);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-10 17:47:20

以下是我们为解决这个问题所做的工作。

  1. 不要一开始就使用Sprint的save
  2. 使用Long version上的Long version标记进行乐观锁定。
  3. 使用标准的Spring数据findById查找记录。如果找到一个,我们就去更新它。如果更新失败,我们知道这台机器失去了它的出价,所以它放弃了。
  4. 如果没有找到记录,请使用JPA persist先插入。如果坚持失败,我们知道这台机器失去了它的出价,所以它放弃了。
  5. 整个过程都封装在一个@Transactional注释中。
  6. 如果我们在这里,没有例外,我们知道我们有胜利者。它继续前进并进行处理。

谢谢大家的帮助!

票数 0
EN

Stack Overflow用户

发布于 2017-04-07 00:00:35

您需要的是乐观锁定,您可以在@Version类中使用一个带有@Entity注释的版本字段来实现这一点。

例如。

代码语言:javascript
复制
@Version
private Long version;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43265875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档