Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

JJUG CCC 2017 Spring LT about JPA

503 visualizaciones

Publicado el

LT about JPA

Publicado en: Ingeniería
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

JJUG CCC 2017 Spring LT about JPA

  1. 1. JPAを初めた時の ちょっとした話 Naoya KOJIMA @jugemix
  2. 2. 学習前のJPAに対するイメージ • SQLを書かなくても永続化層を実装できるらしい • Spring JPAを使うとInterfaceを実装するだけでいいらしい • どう結合するんだろ? • DBMS毎にシーケンスの実装方法、様々だけどどうするの? • なんだか楽できそう
  3. 3. 学習前のJPAに対するイメージ • SQLを書かなくても永続化層を実装できるらしい • Spring JPAを使うとInterfaceを実装するだけでいいらしい • どう結合するんだろ? • DBMS毎にシーケンスの実装方法、様々だけどどうするの? • なんだか楽できそう
  4. 4. 結合してみた 例)運用するWebサイトを管理するアプリケーション customer_sitecustomer operation_date 1 N 1 1
  5. 5. 結合してみた 例)運用するWebサイトを管理するアプリケーション customer_sitecustomer operation_date 1 N 1 1
  6. 6. 結合してみた --H2DB版 CREATE TABLE customer_site ( customer_site_code INT PRIMARY KEY AUTO_INCREMENT, --顧客サイトコード url VARCHAR(1024) NOT NULL, --URL operation_start_time TIMESTAMP NOT NULL, --運用開始時刻 operation_end_time TIMESTAMP NOT NULL, --運用終了時刻 operation_start_date TIMESTAMP NOT NULL, --運用開始日 operation_date_code INT REFERENCES operation_date(operation_date_code), --運用日コード create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP );
  7. 7. 結合してみた --H2DB版 CREATE TABLE operation_date ( operation_date_code INT PRIMARY KEY AUTO_INCREMENT, --運用日コード operation_date_mon VARCHAR(12), --運用日 operation_date_tue VARCHAR(12), --運用日 operation_date_wed VARCHAR(12), --運用日 operation_date_thu VARCHAR(12), --運用日 operation_date_fri VARCHAR(12), --運用日 operation_date_sta VARCHAR(12), --運用日 operation_date_sun VARCHAR(12), --運用日 create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, update_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP );
  8. 8. 結合してみた @Entity @Table(name = "customer_site") public class CustomerSite { @SequenceGenerator(name = "customer_site_customer_site_code_seq", sequenceName = "customer_site_customer_site_code_seq", allocationSize = 1) @GeneratedValue(strategy = GenerationType.AUTO) private Integer customerSiteCode; // 顧客サイトコード /* 中略 */ @OneToOne(cascade=CascadeType.PERSIST) @JoinColumn(name="operation_date_code") private OperationDate operationDate; // 運用日エンティティ }
  9. 9. 結合してみた @Entity @Table(name = "operation_date") public class OperationDate { @SequenceGenerator(name = "operation_date_operation_date_code_seq", sequenceName = "operation_date_operation_date_code_seq", allocationSize = 1) @GeneratedValue(strategy = GenerationType.AUTO) private Integer operationDateCode; // 運用日コード private String operationDateSun; // 日曜日 /* 中略 */ private String operationDateSta; // 土曜日 }
  10. 10. 学習前のJPAに対するイメージ • SQLを書かなくても永続化層を実装できるらしい • Spring JPAを使うとInterfaceを実装するだけでいいらしい • どう結合するんだろ? • DBMS毎にシーケンスの実装方法様々だけど、どうするの? • なんだか楽できそう
  11. 11. H2DBのシーケンスを使ってみた @Entity @Table(name = "customer_site") public class CustomerSite { @SequenceGenerator(name = "customer_site_customer_site_code_seq", sequenceName = "customer_site_customer_site_code_seq", allocationSize = 1) @GeneratedValue(strategy = GenerationType.AUTO) private Integer customerSiteCode; // 顧客サイトコード /* 以下略 */ }
  12. 12. H2DBのシーケンスを使ってみた PostgreSQL Mode @Entity @Table(name = "customer_site") public class CustomerSite { @SequenceGenerator(name = "customer_site_customer_site_code_seq", sequenceName = "customer_site_customer_site_code_seq", allocationSize = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "customer_site_customer_site_code_seq") private Integer customerSiteCode; // 顧客サイトコード /* 以下略 */ } このモードは @cero_tさんが教え てくれました! ありがとうございました!
  13. 13. PostgreSQLのシーケンスを使ってみた @Entity @Table(name = "customer_site") public class CustomerSite { @SequenceGenerator(name = "customer_site_customer_site_code_seq", sequenceName = "customer_site_customer_site_code_seq", allocationSize = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "customer_site_customer_site_code_seq") private Integer customerSiteCode; // 顧客サイトコード /* 以下略 */ } H2DBからPostgresへは移行しや すい~(^^)v
  14. 14. SQLServer2012 のシーケンスを使ってみた @Entity @Table(name = "customer_site") public class CustomerSite { @SequenceGenerator(name = "customer_site_customer_site_code_seq", sequenceName = "customer_site_customer_site_code_seq", allocationSize = 1) @GeneratedValue(strategy = GenerationType.AUTO, generator = "customer_site_customer_site_code_seq") private Integer customerSiteCode; // 顧客サイトコード /* 以下略 */ } SQLServerのシーケンス実装 は,2012Diarectかららしいので注意
  15. 15. Azure SQLServer をSpring Bootから使うとき のappllicaiton.yml spring: profiles: development-sqlserver datasource: driver-class-name : com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://hogehoge.database.windows.net:1433; /* 中略 */ username: hogehoge password: fugafuga jpa: hibernate: ddl-auto: none dialect: org.hibernate.dialect.SQLServer2012Dialect
  16. 16. Azure SQLServer をSpring Bootから使うとき のappllicaiton.yml spring: profiles: development-sqlserver datasource: driver-class-name : com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://hogehoge.database.windows.net:1433; /* 中略 */ username: hogehoge password: fugafuga jpa: hibernate: ddl-auto: none dialect: org.hibernate.dialect.SQLServer2012Dialect 余談ですが、Azure WebApps (PaaS)を使 うと、簡単にWeb Applicationをデプロイで きるので嬉しいです
  17. 17. 学習後のJPAに対するイメージ • UNIONしたくてJDBCでSQLを書くことはあった • 永続化のタイミングを制御出来ず、DBExceptionに気づけないことがあった • saveAndFlush()で制御出来るし、一意制約違反みたいなDBException自体、起こらない ように設計すべきという意見も貰えた • オブジェクトとしてEntityを扱うので、結合の考え方が包含になってて新鮮 • DBMSを変えるときには少しコードを直した • DBMS変えるなんてそうそう無いからいいかな… • 多少は楽できたかも
  18. 18. もっと知りたい • 発行されるSQLの最適化はどうやるの? • バリバリJPQL書いているコードを見てみたい!
  19. 19. ありがとうございました • 僕こんな風にやってるよーなんて方いたら、この後飲みながら 一緒に話しましょう

×