Spring Data JPAのsave時にSELECTしないようにする
Spring Data JPAでは save
する際にレコード存在チェックをしに行くので、これを抑制して INSERT
だけするようにしたい。
同じことを解説している良質な記事は他にたくさんありますので、そっち見てください…。
公式で解説してあります。
Persistable の実装: エンティティが Persistable を実装している場合、Spring Data JPA は新しい検出をエンティティの isNew(…) メソッドに委譲します。
ということなので、該当のエンティティで Persistable
を implements
して、 isNew()
メソッドを実装して true
を返すようにすれば、 save
の際に SELECT
せずに INSERT
をするようになります。逆に false
を返すと SELECT
してから INSERT
または UPDATE
をするデフォルトの状態になります。強制的に UPDATE
することはできないようです。
そんな面倒なことしなくてもJPQLでINSERTしちゃえばいいんじゃね?とちょっと思ったんですけど、JPQLにはINSERTステートメントがないですね。そりゃそうですね、中身JPAですもんね。
ただ、エンティティ毎にINSERTだけしたい!というのが決まればいいんですが、同じエンティティでも「INSERTだけしたい」時と「INSERT/UPDATEしたい」時がある場合、それぞれでクラスを作るのはアホくさい。そうなると切り替え用のフィールドをもたせて、一つのクラスでシーンによって切り替えられるようにしたい。しかし、ベタでフィールドを持たせると、Lombokの @AllArgsConstructor()
の対象になってしまう。キショイ。
なので、以下のような抽象クラス作ってそれを継承させたほうがいいかなって思います。同様のエンティティで使い回せるし。
※エンティティクラスで getId()
メソッドを実装する必要があります。
|
|
以下がそれを継承するエンティティクラス。
|
|