IDがInteger型ではないentityでsaveする(SpringFramework)
よく見かける登録処理(idがInteger型で自動連番)
Springのサンプルコードでよく見るのは、
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {
@Id
private Integer id;
private String name;
}
というような、idがInteger型のものである。
これでリポジトリを作成すると、
public interface MemberCrudRepository extends CrudRepository {
}
となる。
このリポジトリを使って、CRUD処理をした場合、登録処理は以下のようになる。
@SpringBootApplication
public class SampleApplication {
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args)
.getBean(SampleApplication.class).execute;
}
private void execute() {
executeInsert();
}
private void executeInsert() {
Member member1 = new Member(null, "花子"); --- <1>
member1 = repository.save(member1); --- <2>
Sytem.out.println("登録したデータ:" + member1);
}
}
<1>のところで、idにはnull を代入している。
<2>では、save()メソッドは、idがnullの場合は insert処理を行い、
idがすでに存在していれば update処理を行うようになっている。
idは AUTO_INCREMENT なので、これができる。
idが文字列の場合はどうなるか?
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {
@Id
private String id;
private String name;
}
この entity をmain()メソッドに書いたこの記述でいくと、
private void executeInsert() {
Member member = new Member("EMP002", "花子"); --- <1>
member = repository.save(member); --- <2>
Sytem.out.println("登録したデータ:" + member);
}
「”EMP002″というidが見つからないので、UPDATE()処理ができなかった」という
意味のエラーメッセージが出力される。
どうするか?(思いついた解決法)
いろいろ調べてみたが、今のところ、以下のような解決法しかわからなかった。
(1) リポジトリに登録用の処理を書く。
public interface MemberCrudRepository extends CrudRepository {
@Modifying
@Query("INSERT INTO member (id, name) VALUES (:id, :name)")
void insertMember(@Param("id")String id, @Param("name")String name);
}
@Queryアノテーションだけだと、executeQuery()処理が呼び出されて失敗する。
@Modifyingアノテーションをつけると、executeUpdate()処理が呼び出される。
(2) main()メソッドの中の処理で使う。
private void executeInsert() {
Member member = new Member("EMP002", "花子"); --- <1>
member = repository.insertMember(member.getId(), member.getName());
--- <2>
Sytem.out.println("登録したデータ:" + member);
}
これで、とりあえずは、動いた。
参考
How to use JPA Query to insert data into db?
カテゴリー: Java, memo, Spring
タグ: id, repository, save, String, 文字列型IDを使う, 登録
カウント: 159