Когда я пытаюсь сохранить один и тот же объект с помощью пружинного JpaRepository несколько раз параллельно, я получаю запись Duplicate для ключа PRIMARY
. TestEntity состоит из двух значений, которые часто меняются, и TestEntityId остается неизменным. Идея состоит в том, чтобы обновить TestEntity на основе EmbeddedId с помощью метода save, поскольку я не уверен, существует ли TestEntity в базе данных.
Если это часто случается для одного и того же EmbeddedId, я получаю ошибку ввода Duplicate довольно быстро. Я также могу воспроизвести поведение в модульном тесте.
Когда я запускаю тест, я получаю исключение: java.sql.SQLIntegrityConstraintViolationException: дублирующая запись '1-2-prov' для ключа 'PRIMARY'
@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
}
1011 * TestCase *
@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));
...
}
Я уже пытался добавить транзакции или другие блокировки в таблицу, а также другой способ объявить составной первичный ключ.
Было бы замечательно, если бы вы знали, как решить эту проблему.