使用组成的PrimaryKey更新JPA实体会导致重复输入错误

时间:2019-05-23 06:28:17

标签: java database jpa spring-data-jpa primary-key

当我尝试使用spring JpaRepository并行存储同一实体多次时,我得到了密钥PRIMARY的Duplicate条目。 TestEntity由两个经常更改的值组成,并且TestEntityId保持不变。想法是使用save方法基于EmbeddedId更新TestEntity,因为我不确定TestEntity是否已存在于数据库中。

如果相同的EmbeddedId经常发生这种情况,我会很快收到Duplicate条目错误。我还可以在单​​元测试中重现该行为。

运行测试时,出现异常:java.sql.SQLIntegrityConstraintViolationException:键“ PRIMARY”的条目“ 1-2-prov”重复

@Entity
public class TestEntity {
    @EmbeddedId
    private TestEntityId testEntityId;
    @Column
    private String value1;
    @Column
    private String value2;
...
}
@Embeddable
public class TestEntityId implements Serializable {
    private double lat;
    private double lng;
    private String prov;
...
}
@Repository
public interface TestEntityRepository extends JpaRepository<TestEntity, TestEntityId> {
// Empty
}

测试用例

@Test
public void testStoreSameEntryMultipleTimes() {
   LongStream.range(1L, 100L).boxed().parallel()
       .map((i) -> new TestEntityId(1.0, 2.0, "prov"))
       .map((te) -> new TestEntity(te , "value1", "value2"))
       .forEach((e) -> testEntityRepository.save(e));
...
}

我已经尝试在表上添加事务或其他锁,以及声明组合主键的其他方式。

如果您对如何解决此问题有任何想法,那就太好了。

1 个答案:

答案 0 :(得分:2)

问题是您要使用相同的主键创建100个实体,而不是使用i来增加它们。