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制約がつきます。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント