在使用Spring Data时,如何确定是否插入重复内容?

时间:2017-04-06 21:13:48

标签: java spring oracle orm spring-data-jpa

- Spring-Data-JPA,Java 8,JUnit-4(用于测试)

我有一个实体,我们称之为Semaphore。有多台机器试图创建一行Semaphore。我们只希望其中一个成功。这是发生的事情 -

  1. Semaphore行有一个主键,始终为1。
  2. 计算机A使用Spring Data save
  3. 创建信号量并将其保存到数据库
  4. 机器B 认为它也在创建信号量并调用save但最终会更新它,而不会让客户端代码知道它。我可以检查exists,但这并不保证任何内容,因为两台机器都可以在其中任何一台创建记录之前进行检查。
  5. 使用插页赢得的机器将在完成处理后清理表格。
  6. 我们有什么选择,除了直接使用实体管理器查看实体是否是新的?基本上覆盖Spring Data保存方法。

    我们使用Oracle作为数据库。

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

    @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);
        }
    }
    

2 个答案:

答案 0 :(得分:1)

您需要的是乐观锁定,您可以使用@Version类中使用@Entity注释的版本字段来完成此操作。

E.g。

@Version
private Long version;

答案 1 :(得分:0)

以下是我们解决此问题的方法。

  1. 一开始就使用Sprint数据save
  2. 使用@Version字段上的Long version标记进行乐观锁定版本。
  3. 使用标准Spring数据findById查找记录。如果找到一个我们去更新它。如果更新失败,我们知道这台机器失去了它的出价,所以它放弃了。
  4. 如果未找到记录,请先使用JPA persist进行插入。如果坚持不通,我们就知道这台机器失去了它的出价,所以它放弃了。
  5. 整个事情都包含在@Transactional注释中。
  6. 如果我们在这里并且没有例外,我们知道我们有一个胜利者。它继续进行和处理。
  7. 感谢大家的帮助!