"PreparedStatement 생성 시 자동 생성 키를 반환하라는 옵션 설정: setReturnGeneratedKeys(true)"
구버전 프로젝트에서 keyHolder.getKey()의 값이 항상 null이 되며, .longValue()를 호출하면 NullPointerException 발생
1. JDBC 스펙은 자동 생성 키를 요청한 경우에만 Statement 또는 PreparedStatement에 getGeneratedKeys()를 통해 값을 돌려주도록 정의
2. 따라서 prepareStatement(sql, Statement.RETURN_GENERATED_KEYS) 또는 Spring JDBC에서 같은 역할을 하는 PreparedStatementCreatorFactory#setReturnGeneratedKeys(true) 를 지정하지 않으면 드라이버는 키를 수집하지 않음
3. 반환 플래그를 주면 드라이버가 내부적으로 INSERT 실행과 동시에 생성된 키를 메모리에 보존해 getGeneratedKeys()로 즉시 전달
KeyHolder keyHolder = new GeneratedKeyHolder();
PreparedStatementCreatorFactory factory = new PreparedStatementCreatorFactory(
"insert into User (name, createdAt) values (?, ?)",
Types.VARCHAR, Types.TIMESTAMP
);
factory.setReturnGeneratedKeys(true);
PreparedStatementCreator psc = factory.newPreparedStatementCreator(
Arrays.asList(name, timestamp)
);
jdbcTemplate.update(psc, keyHolder);
Long id = keyHolder.getKey().longValue();'개발 > 자바' 카테고리의 다른 글
| Spring Boot에서 초기화 SQL(schema.sql, data.sql) 활용 (0) | 2025.08.02 |
|---|---|
| 구버전 프로젝트, 최신 스프링 부트로 올리니 Validation 관련 오류 발생 (3) | 2025.07.29 |
| [JPA] deleteById()로 없는 엔티티 삭제 시 예외가 발생하지 않는 이유와 정책 변화 (1) | 2025.06.06 |
| 추상 클래스, 인터페이스 (0) | 2023.10.30 |
| IntelliJ JUnit @DisplayName 한글 깨짐 에러 (0) | 2023.06.24 |