LoginSignup
1
0

SpringDataJPAでsave()時のテーブル名に"_seq"が自動で付いてdoesn't existと怒られる

Last updated at Posted at 2023-11-22

環境

名称 バージョン
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

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0