Spring BootのJPAでテーブルをエンティティから自動生成する方法

Spring BootのJPAでテーブルをエンティティから自動生成する方法

JPAのエンティティからテーブル作成するのを実装してみました。

まず以下のような複合主キーのエンティティを作ってみます。

package jp.co.confrage;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Entity
@Table(name="employee_masters2")
public class Employee {
  @EmbeddedId
  private PrimaryK id;

  @Column(name="empname")
  private String empname;

  @Embeddable
  @Data
  @AllArgsConstructor
  @NoArgsConstructor
  public static class PrimaryK implements Serializable{
    private static final long serialVersionUID = -2523459362991270288L;
    @Column(name="id")
    private String id;

    @Column(name="empno")
    private String empno;
  }
}

application.propertiesに以下を追記します。

spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/sampledb?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=system
spring.jpa.database=MYSQL
spring.jpa.database-platform=org.hibernate.dialect.MySQL57Dialect
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true

データベース名はsampledbです。MySQL57Dialectを使用していますが以下でもいけます。

  • org.hibernate.dialect.MySQL55Dialect
  • org.hibernate.dialect.MySQL57Dialect ← 今回はこちらを使用しています(ストレージエンジンはInnoDBになります)

MariaDBの場合は以下のどちらかにする必要があります。

  • org.hibernate.dialect.MariaDBDialect
  • org.hibernate.dialect.MariaDB53Dialect

spring.jpa.hibernate.ddl-auto=createと指定することによってSpring Bootアプリケーション起動時にテーブル作成してくれます。

spring.jpa.show-sql=trueを指定すると、コンソールにログが出力されます。

Hibernate: drop table if exists employee
Hibernate: create table employee(empno varchar(255) not null, id varchar(255) not null, empname varchar(255), primary key (empno, id)) engine=InnoDB

テーブル文字コードがlatin1になるのでuseUnicode=yes&characterEncoding=UTF-8を追記したけどlatin1のままなので、my.iniの

  • default-character-set=utf-8
  • character-set-server=utf8

にしてMySQLを再起動してもうまくいきませんでした。

なのでとりあえず

create database DB名;

としてDB作成します。文字コードを確認します。

mysql> show variables like 'character%';
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8                                                    |
| character_set_connection | utf8                                                    |
| character_set_database   | utf8                                                    |
| character_set_filesystem | binary                                                  |
| character_set_results    | utf8                                                    |
| character_set_server     | utf8                                                    |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+

PostgreSQLで確認

PostgreSQLで確認します。

application.ymlです。

spring:
  jpa:
    database: POSTGRESQL
    hibernate:
      ddl-auto: create
    show-sql: true
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://localhost:5432/testdb
    username: postgres
    password: postgres

テーブルに対応するエンティティを作成します。

このエンティティクラスでは@Entityアノテーションでテーブル名を指定して作成し、@Indexアノテーションでユニークインデックスを作成しています。

カラム名を@Columnアノテーションで省略した場合は、変数名がカラム名となります。

package jp.co.confrage.domain.entity;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.Table;

import lombok.Data;

@Data
@Entity
@Table(
  name = "employee",
  indexes = @Index(name = "employee_index", columnList = "name,age", unique = true))
public class Employee {
  @Id private Long id;
  private String name;
  private Integer age;
}

コンソールログです。

Hibernate: create table employee (id int8 not null, age int4, name varchar(255), primary key (id))
Hibernate: alter table if exists employee add constraint employee_index unique (name, age)

Not Null制約を付けたい場合は、@Column(nullable = false)をフィールドに付与するとNot Null制約がつきます。

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました