силовая вставка с пружинными данными jpa

Я хотел бы заставить CrudRepository#save(entity) вставить новый объект вместо того, чтобы сначала выбирать объект и обновлять его, если первичный ключ уже существует.

попробую привести пример

public class Lock
{
    @Id
    @Column
    private UUID uuid;
    ...
}


UUID id = UUID.randomUUID();
Lock firstLock = new Lock(id);
Lock secondLock = new Lock(id);
repo.save(firstLock);
repo.save(secondLock);

что происходит, так это то, что первая операция сохранения выполняет следующие два оператора

Hibernate: select lock0_.uuid as uuid5_0_, lock0_.expires as expires5_0_ from locks lock0_ where lock0_.uuid=?
Hibernate: insert into locks (expires, uuid) values (?, ?)

в то время как второй вызов для сохранения выполняет оператор обновления

Hibernate: select lock0_.uuid as uuid5_0_, lock0_.expires as expires5_0_ from locks lock0_ where lock0_.uuid=?
Hibernate: update locks set expires=? where uuid=?

Как мне убедиться, что второй вызов сохранения не просто обновляет ранее сохраненную запись? Я хочу, чтобы он выполнил оператор вставки и потерпел неудачу, потому что тот же первичный ключ уже существует


person Daniel Freudenberger    schedule 18.10.2012    source источник


Ответы (1)


Принудительная вставка для объекта, идентификатор которого не равен нулю, не допускается в Spring Data JPA.

Обычно генератор идентификаторов используется для первичного ключа, который обеспечивает уникальность сгенерированных идентификаторов. (например, @GeneratedValue(strategy = GenerationType.AUTO))

Такое поведение на мой взгляд правильное. В ORM использование оператора new указывает на намерение создать новый объект с неявным требованием присвоить ему уникальный идентификатор.

Но если вы все равно хотите попробовать, вы можете изучить собственный @GenericGenerator.

http://www.georgestragand.com/jpaseq.html

person sgp15    schedule 18.10.2012