環境
名称 | バージョン |
---|---|
Spring Boot | 3.1.5 |
SpringDataJPA | 3.1.5 |
Hibernate | 6.2.13 |
MySQL | 8.0.34 |
問題
「T_TEST」テーブルに対してsave()実行時にエラーが出た。「_seq」はどこから出てきた?
なお、SELECT実行時は問題なかった。
java.sql.SQLSyntaxErrorException: Table 'testdb.t_test_seq' doesn't exist
Entity
TestDto.java
package com.bootsample.dto;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
import lombok.Data;
import org.springframework.data.domain.Persistable;
/**
* テストEntity
*/
@Entity
@Table(name = "t_test")
@Data
public class TestDto implements BaseDto, Persistable<Long> {
/**
* テストコード
*/
@Id
@Column(name = "test_code")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer testCode;
/**
* テスト名
*/
@Column(name = "test_name")
private String testName;
/**
* 登録日時
*/
@Column(name = "register_datetime")
private LocalDateTime registerDatetime;
/**
* 更新日時
*/
@Column(name = "update_datetime")
private LocalDateTime updateDatetime;
/**
* 削除日時
*/
@Column(name = "delete_datetime")
private LocalDateTime deleteDatetime;
@Override
@Deprecated
public Long getId() {
return null;
}
@Override
public boolean isNew() {
return true;
}
}
解決方法
@GeneratedValueでGenerationType.IDENTITYを指定したら解消した。
TestDto.java
// @GeneratedValue(strategy = GenerationType.AUTO)
@GeneratedValue(strategy = GenerationType.IDENTITY)
AUTOの時は、GenerationType.SEQUENCEを指定した時の挙動をしていた。
通常、DBがMySQLの場合は、AUTOを指定すればIDENTITYを指定した時の挙動になるらしいのだが、、何故、、
今回は出番が無かったが、application.propertiesで旧式の命名方法を採用するように指定すればよい、といった知見もあった。
いずれ役に立つかもしれないので覚え書き。
spring.jpa.properties.hibernate.id.db_structure_naming_strategy: legacy
参考