3

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);

最初の保存操作で次の 2 つのステートメントが実行されます。

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 (?, ?)

save の 2 番目の呼び出しが update ステートメントを実行している間

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=?

save への 2 回目の呼び出しが以前に保存されたレコードを単純に更新しないようにするにはどうすればよいですか? 同じ主キーが既に存在するため、insert ステートメントを実行して失敗させたい

4

1 に答える 1

1

IDがnullでないエンティティに強制的に挿入することは、SpringDataJPAでは許可されていません。

通常、IDジェネレーターは、生成されたIDが一意であることを保証する主キーに使用されます。(例:@GeneratedValue(strategy = GenerationType.AUTO))

私の意見では、この振る舞いは正しいです。ORMでは、new演算子を使用すると、一意のIDを割り当てるという暗黙の要件を持つ新しいエンティティを作成する意図が示されます。

ただし、とにかく試してみたい場合は、カスタムの@GenericGeneratorを調べることができます。

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

于 2012-10-18T17:17:19.877 に答える