Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

JJUG CCC 2017 Spring LT about JPA

502 Aufrufe

Veröffentlicht am

LT about JPA

Veröffentlicht in: Ingenieurwesen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

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. ありがとうございました • 僕こんな風にやってるよーなんて方いたら、この後飲みながら 一緒に話しましょう

×