似非プログラマのうんちく

「似非プログラマの覚え書き」出張版

春だから Spring やろうぜ(その 9)

エンティティから DDL を自動実行

以下のようなエンティティから DDL を自動で実行してデータベースにテーブルを作ってもらいたい。

package jp.mydns.akanekodou.demo.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import lombok.Getter;
import lombok.Setter;

@Entity @Getter @Setter
public class MyData {
    @Id @GeneratedValue
    private long id;
    @Column(length = 50, nullable = false)
    private String name;
    @Column(length = 200)
    private String mail;
    private Integer age;
    private String memo;
}

H2 などの組み込みデータベースなら特に設定はいらないのだけど、PostgreSQL を使っているのでそのままでは上手く行かない。そこで application.properties に 1 行追加する。

spring.jpa.hibernate.ddl-auto=update

これで必要に応じて DDL を生成・発行してデータベース側にテーブルを作ってくれる。

詳しい解説はこちら。

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html#howto-initialize-a-database-using-hibernate


本格的な運用は次回以降に回すとして、とりあえず動作確認できる最低限のコードを用意する。

package jp.mydns.akanekodou.demo.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import jp.mydns.akanekodou.demo.entity.MyData;

@Repository
public interface MyDataRepository extends JpaRepository<MyData, Long> {

}
package jp.mydns.akanekodou.demo;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import jp.mydns.akanekodou.demo.entity.MyData;
import jp.mydns.akanekodou.demo.repositories.MyDataRepository;

@Controller
public class HelloController {
    @Autowired
    MyDataRepository repository;

    @RequestMapping(value="/")
    public ModelAndView index(ModelAndView mav) {
        mav.setViewName("hello");
        mav.addObject("msg", "This is sample content.");
        List<MyData> list = repository.findAll();
        mav.addObject("data", list);
        return mav;
    }
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <title>Top page</title>
    <link th:href="@{/css/hello.css}" rel="stylesheet" />
  </head>
  <body>
    <h1 th:text="#{content.title}">Top page</h1>
    <p th:text="${msg}"></p>
    <pre th:text="${data}"></pre>
  </body>
</html>
h1 {
  font-size: 18pt;
  font-weight: bold;
  color: gray;
}

body {
  font-size: 13pt;
  color: gray;
  margin: 5px 25px;
}

pre {
  border: solid 3px #ddd;
  padding: 10px;
}

f:id:redcat_prog:20180421150641p:plain

まだ何もデータを入れていないので空のリストしか表示されないけど、とりあえず動いてはいる。