通常は@SequenceGenerator
を使って取得・バインドするのが普通なんだと思うが、
プレフィックスやチェックデジットなどをつけたかった。
SQLを発行してシーケンスを取得すれば出来そう!
...と思って挑んでみたものの1日詰まったのでまとめておく。
動作環境
- Java 8
- Spring Boot 1.3.2
- JdbcTemplate
IDを生成するIdGenerator
これを元にIdGenerator
クラスを作ってみた。
@Component
をつけることで@Autowired
をつけたクラスをDIしてくれるので忘れると動かない。
src/main/java/com/example/util/IdGenerator.java
package com.example.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class IdGenerator {
@Autowired
JdbcTemplate jdbcTemplate;
public long generateId() {
long seq = this.jdbcTemplate.queryForObject("SELECT HOGE_SEQ.NEXT_VAL FROM DUAL", Long.class);
// ...チェックデジットの計算などする... //
return seq;
}
}
IdGenerator
を使う
先ほど作ったIdGenerator
を使う時には自分でインスタンスを作るのではなく、@Autowired
をつけてDIするように定義する。
そうしないとJdbcTemplate
のインスタンスがセットされず、呼び出し時にNullPointerException
が発生する。
※全然気が付かずにこれで1日はまった...
src/main/java/com/example/welcome/WelcomeController.java
@Controller
public class WelcomeController {
@Autowired
IdGenerator idGenerator;
// ... //
@RequestMapping(value="/hello", method=RequestMethod.POST)
public String hello(@Valid Member member, BindingResult bindingResult)
{
if (bindingResult.hasErrors())
{
return "welcome";
}
model.setAttribute('id', idGenerator.generateId());
return "hello";
}
}