My開発メモ

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