SlideShare une entreprise Scribd logo
1  sur  19
Télécharger pour lire hors ligne
JPAを初めた時の
ちょっとした話
Naoya KOJIMA @jugemix
学習前のJPAに対するイメージ
• SQLを書かなくても永続化層を実装できるらしい
• Spring JPAを使うとInterfaceを実装するだけでいいらしい
• どう結合するんだろ?
• DBMS毎にシーケンスの実装方法、様々だけどどうするの?
• なんだか楽できそう
学習前のJPAに対するイメージ
• SQLを書かなくても永続化層を実装できるらしい
• Spring JPAを使うとInterfaceを実装するだけでいいらしい
• どう結合するんだろ?
• DBMS毎にシーケンスの実装方法、様々だけどどうするの?
• なんだか楽できそう
結合してみた
例)運用するWebサイトを管理するアプリケーション
customer_sitecustomer operation_date
1 N 1 1
結合してみた
例)運用するWebサイトを管理するアプリケーション
customer_sitecustomer operation_date
1 N 1 1
結合してみた
--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
);
結合してみた
--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
);
結合してみた
@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; // 運用日エンティティ
}
結合してみた
@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; // 土曜日
}
学習前のJPAに対するイメージ
• SQLを書かなくても永続化層を実装できるらしい
• Spring JPAを使うとInterfaceを実装するだけでいいらしい
• どう結合するんだろ?
• DBMS毎にシーケンスの実装方法様々だけど、どうするの?
• なんだか楽できそう
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; // 顧客サイトコード
/* 以下略 */
}
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さんが教え
てくれました!
ありがとうございました!
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
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かららしいので注意
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 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をデプロイで
きるので嬉しいです
学習後のJPAに対するイメージ
• UNIONしたくてJDBCでSQLを書くことはあった
• 永続化のタイミングを制御出来ず、DBExceptionに気づけないことがあった
• saveAndFlush()で制御出来るし、一意制約違反みたいなDBException自体、起こらない
ように設計すべきという意見も貰えた
• オブジェクトとしてEntityを扱うので、結合の考え方が包含になってて新鮮
• DBMSを変えるときには少しコードを直した
• DBMS変えるなんてそうそう無いからいいかな…
• 多少は楽できたかも
もっと知りたい
• 発行されるSQLの最適化はどうやるの?
• バリバリJPQL書いているコードを見てみたい!
ありがとうございました
• 僕こんな風にやってるよーなんて方いたら、この後飲みながら
一緒に話しましょう

Contenu connexe

Tendances

[社内勉強会]Webエンジニアへ送るインフラのおすすめ本:記事7本
[社内勉強会]Webエンジニアへ送るインフラのおすすめ本:記事7本[社内勉強会]Webエンジニアへ送るインフラのおすすめ本:記事7本
[社内勉強会]Webエンジニアへ送るインフラのおすすめ本:記事7本
Takahiro Moteki
 
a-blog cms初心者が テンプレート作るまで
a-blog cms初心者が テンプレート作るまでa-blog cms初心者が テンプレート作るまで
a-blog cms初心者が テンプレート作るまで
girigiribauer
 

Tendances (20)

Data Engineering at VOYAGE GROUP #jawsdays
Data Engineering at VOYAGE GROUP #jawsdaysData Engineering at VOYAGE GROUP #jawsdays
Data Engineering at VOYAGE GROUP #jawsdays
 
じっくりコトコト煮込んだJavaスープ
じっくりコトコト煮込んだJavaスープじっくりコトコト煮込んだJavaスープ
じっくりコトコト煮込んだJavaスープ
 
JPUG の中国支部長変わったってよ #mysqlbeginner
JPUG の中国支部長変わったってよ #mysqlbeginnerJPUG の中国支部長変わったってよ #mysqlbeginner
JPUG の中国支部長変わったってよ #mysqlbeginner
 
JavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなことJavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなこと
 
クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
Viewを使って開発を楽にする話
Viewを使って開発を楽にする話Viewを使って開発を楽にする話
Viewを使って開発を楽にする話
 
MySQLトラブル解析入門
MySQLトラブル解析入門MySQLトラブル解析入門
MySQLトラブル解析入門
 
LESS楽しいれす(^q^)
LESS楽しいれす(^q^) LESS楽しいれす(^q^)
LESS楽しいれす(^q^)
 
ActiveRecord::Enumのススメ
ActiveRecord::EnumのススメActiveRecord::Enumのススメ
ActiveRecord::Enumのススメ
 
5分では終わりそうにないfunctionsの話
5分では終わりそうにないfunctionsの話5分では終わりそうにないfunctionsの話
5分では終わりそうにないfunctionsの話
 
[社内勉強会]Webエンジニアへ送るインフラのおすすめ本:記事7本
[社内勉強会]Webエンジニアへ送るインフラのおすすめ本:記事7本[社内勉強会]Webエンジニアへ送るインフラのおすすめ本:記事7本
[社内勉強会]Webエンジニアへ送るインフラのおすすめ本:記事7本
 
A/BテストをAzure×Googleアナリティクスで試してみました。
A/BテストをAzure×Googleアナリティクスで試してみました。A/BテストをAzure×Googleアナリティクスで試してみました。
A/BテストをAzure×Googleアナリティクスで試してみました。
 
a-blog cms初心者が テンプレート作るまで
a-blog cms初心者が テンプレート作るまでa-blog cms初心者が テンプレート作るまで
a-blog cms初心者が テンプレート作るまで
 
開発資料
開発資料開発資料
開発資料
 
フレームワークMarko
フレームワークMarkoフレームワークMarko
フレームワークMarko
 
サーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみたサーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみた
 
Webデザイナー視点で使ってみた Microsoft Azureの話
Webデザイナー視点で使ってみたMicrosoft Azureの話Webデザイナー視点で使ってみたMicrosoft Azureの話
Webデザイナー視点で使ってみた Microsoft Azureの話
 
サーバーレスでアンケートフォームを作ってみた
サーバーレスでアンケートフォームを作ってみたサーバーレスでアンケートフォームを作ってみた
サーバーレスでアンケートフォームを作ってみた
 
サーバーのおしごと
サーバーのおしごとサーバーのおしごと
サーバーのおしごと
 

Similaire à JJUG CCC 2017 Spring LT about JPA

Data Engineering at VOYAGE GROUP #jawsdays
Data Engineering at VOYAGE GROUP #jawsdaysData Engineering at VOYAGE GROUP #jawsdays
Data Engineering at VOYAGE GROUP #jawsdays
VOYAGE GROUP
 
JavaScriptトレンド総括(2014)
JavaScriptトレンド総括(2014)JavaScriptトレンド総括(2014)
JavaScriptトレンド総括(2014)
VOYAGE GROUP
 
ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~
Akihiro Kuwano
 
レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話
nekogeruge_987
 

Similaire à JJUG CCC 2017 Spring LT about JPA (20)

Data Engineering at VOYAGE GROUP #jawsdays
Data Engineering at VOYAGE GROUP #jawsdaysData Engineering at VOYAGE GROUP #jawsdays
Data Engineering at VOYAGE GROUP #jawsdays
 
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
 
2016/12/17 ASP.NET フロントエンドタスク入門
 2016/12/17 ASP.NET フロントエンドタスク入門 2016/12/17 ASP.NET フロントエンドタスク入門
2016/12/17 ASP.NET フロントエンドタスク入門
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
第51回NDS PostgreSQLのデータ型 #nds51
第51回NDS PostgreSQLのデータ型 #nds51第51回NDS PostgreSQLのデータ型 #nds51
第51回NDS PostgreSQLのデータ型 #nds51
 
第52回なんてかんたんなJavaEE
第52回なんてかんたんなJavaEE第52回なんてかんたんなJavaEE
第52回なんてかんたんなJavaEE
 
JavaScriptトレンド総括(2014)
JavaScriptトレンド総括(2014)JavaScriptトレンド総括(2014)
JavaScriptトレンド総括(2014)
 
MySQLメインの人がPostgreSQLのベンチマークをしてみた話
MySQLメインの人がPostgreSQLのベンチマークをしてみた話MySQLメインの人がPostgreSQLのベンチマークをしてみた話
MySQLメインの人がPostgreSQLのベンチマークをしてみた話
 
Fluentd casual
Fluentd casualFluentd casual
Fluentd casual
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
Eight meets AWS
Eight meets AWSEight meets AWS
Eight meets AWS
 
ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~
 
Google Cloud Platformでソーシャルゲームを1本出してみた!
Google Cloud Platformでソーシャルゲームを1本出してみた!Google Cloud Platformでソーシャルゲームを1本出してみた!
Google Cloud Platformでソーシャルゲームを1本出してみた!
 
レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話
 
Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1Jjugccc2017spring-postgres-ccc_m1
Jjugccc2017spring-postgres-ccc_m1
 
Azure API Management 俺的マニュアル
Azure API Management 俺的マニュアルAzure API Management 俺的マニュアル
Azure API Management 俺的マニュアル
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2
 
オンプレでもクラウドでも データベースサーバの運用
オンプレでもクラウドでも データベースサーバの運用オンプレでもクラウドでも データベースサーバの運用
オンプレでもクラウドでも データベースサーバの運用
 

Plus de Naoya Kojima

Plus de Naoya Kojima (11)

What’s Next For Selenium?
What’s Next For Selenium?What’s Next For Selenium?
What’s Next For Selenium?
 
Automated Analytics Testing
Automated Analytics TestingAutomated Analytics Testing
Automated Analytics Testing
 
20170710 hifive-test-meetup
20170710 hifive-test-meetup20170710 hifive-test-meetup
20170710 hifive-test-meetup
 
JJUG CCC 2017 Spring LT about Twice Submit
JJUG CCC 2017 Spring LT about  Twice SubmitJJUG CCC 2017 Spring LT about  Twice Submit
JJUG CCC 2017 Spring LT about Twice Submit
 
20161222 selenium adventcalender
20161222 selenium adventcalender20161222 selenium adventcalender
20161222 selenium adventcalender
 
20161218 selenium study4
20161218 selenium study420161218 selenium study4
20161218 selenium study4
 
20161212 selenium adventcalender
20161212 selenium adventcalender20161212 selenium adventcalender
20161212 selenium adventcalender
 
20161203 selenium adventcalender
20161203 selenium adventcalender20161203 selenium adventcalender
20161203 selenium adventcalender
 
20161218 selenium study4-part1
20161218 selenium study4-part120161218 selenium study4-part1
20161218 selenium study4-part1
 
jjug_night_20161121
jjug_night_20161121jjug_night_20161121
jjug_night_20161121
 
Azureを使って手軽にブラウザテストの自動化をはじめよう
Azureを使って手軽にブラウザテストの自動化をはじめようAzureを使って手軽にブラウザテストの自動化をはじめよう
Azureを使って手軽にブラウザテストの自動化をはじめよう
 

JJUG CCC 2017 Spring LT about JPA