Обновление сущности JPA с составным PrimaryKey приводит к ошибке повторяющегося ввода - PullRequest
0 голосов
/ 23 мая 2019

Когда я пытаюсь сохранить один и тот же объект с помощью пружинного 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));
...
}

Я уже пытался добавить транзакции или другие блокировки в таблицу, а также другой способ объявить составной первичный ключ.

Было бы замечательно, если бы вы знали, как решить эту проблему.

1 Ответ

2 голосов
/ 23 мая 2019

Проблема в том, что вы создаете 100 сущностей с одним и тем же первичным ключом вместо использования i для их увеличения.

...