当我尝试使用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));
...
}
我已经尝试在表上添加事务或其他锁,以及声明组合主键的其他方式。
如果您对如何解决此问题有任何想法,那就太好了。
答案 0 :(得分:2)
问题是您要使用相同的主键创建100个实体,而不是使用i
来增加它们。