春だから 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 を生成・発行してデータベース側にテーブルを作ってくれる。
詳しい解説はこちら。
本格的な運用は次回以降に回すとして、とりあえず動作確認できる最低限のコードを用意する。
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; }
まだ何もデータを入れていないので空のリストしか表示されないけど、とりあえず動いてはいる。