SlideShare una empresa de Scribd logo
1 de 46
JPAの基礎と現場で役立つ開発Tips
SI-Toolkit for Application Development
• はじめに
• 環境構築
• JPA Programming
• JPA Configuration
• まとめ
はじめに
SI-Toolkit : SIプロジェクトで必要な道具一式
• Application Development : Java EE & CI/CD
• Web Testing : Test Automation
Concept:もっとSmartなSIを!
株式会社モノクレア
• SIプロジェクトの技術コンサルティング
• アプリケーションアーキテクチャ
• 開発方法論
• テスト自動化
• CI/CD
環境構築
構築する環境
Eclipse Project
pom.xml
src
main
java
a.b.c.myproject.domain.user
UserRepository.java
resources
META-INF
persistence.xml
test
java
a.b.c.myproject.domain.user
UserRepositoryTest.java
target/generate-sources/hibernate-tools
a.b.c.myproject.domain.user
UserEntity.java
tools
derby
migration
V1__create_user_and_group.sql
hibernate-tools
DB
(Derby)
Hibernate
Tools
Flyway
JPA, CDI1. create project
from
maven archetype
3. db migrate
4. reverse engineer
2. start db
プロジェクト作成 正式
• 手順詳細
• クイックスタート Eclipseで実行する場合
• 「ファイル」メニュー>新規>Mavenプロジェクト
• カタログ
• Remote http://repo.maven.apache.org/maven2/archetype-catalog.xml
• アーキタイプ
• グループId:org.sitoolkit.ad.archetype アーティファクトId:javaee7-web-tips バージョ
ン:1.1.1
プロジェクト作成 当勉強会用
• project-generator.zipをダウンロード
• https://github.com/sitoolkit/sit-ad-archetype-javaee7-web/issues/17
• Eclipseに既存プロジェクトとしてインポート
• 「ファイル」メニュー>インポート>既存プロジェクトをワークスペースへ
プロジェクト作成 当勉強会用
• 「Java EE」パースペクティブ「プロジェクト・エクスプローラー」ビューでproject-generatorプロ
ジェクトを右クリック>実行>Mavenビルド または Alt + Shift + X, M (alt + shift +
X, M)
• project-generatorプロジェクトを右クリック>リフレッシュ またはF5
• myprojectフォルダを右クリック>Import as Project
• project-generatorプロジェクトを右クリック>閉じる
derbyプロファイルをactivate
• myproject/pom.xmlを開く
• mysql以下のactivationをderby以下に移動
• derbyプロファイルのpropertiesにdb.catalogプロパティを空で設定
l.95
<profile>
<id>derby</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<db.catalog></db.catalog>
<db.client.groupId>org.apache.derby</db.client.groupId>
l.117
<profile>
<id>mysql</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
wildfly-testプロファイルをactivate
• プロジェクト右クリック>Maven>Mavenプロファイルの選択
• wildfly-testを選択
Derbyを起動
• プロジェクト右クリック>実行>Mavenビルド または Alt + Shift + X, M
• myproject_10_derby-runを選択>OK
• 「ウィンドウ」メニュー>パースペクティブ>パースペクティブを開く>その他
• DBViewerを選択>OK
• 「DBツリー・ビュー」で「データベース定義をインポート」をクリック
• myproject/target/test-classes/dbviewer/derby.xmlを選択
データベース接続定義をインポート
データベースを参照
• インポートしたデータベース定義をダブルクリック
db-migrateを実行
• myprojectプロジェクト右クリック>実行>Mavenビルド または Alt + Shift + X, M
• myproject_01_db-migrateを選択>OK
db-migrate後のデータベース
• APPを右クリック>更新 または F5
• USER_ENTITYをダブルクリック
db-migrate後のJavaリソース
• myprojectプロジェクトを右クリック>リフレッシュ または F5
Before After
サンプルテストを開く
• 「ナビゲート」メニュー>リソースを開く または Ctrl + Shift + R
サンプルテストを実行
• UserRepositoryTest.javaを開いた状態で右クリック>実行>Junitテスト または Alt +
Shift + X, T
JPA Programming
INSERT
• UserRepositoryTest.javaにEntityManagerフィールドとtestInsertメソッドを実装して実
行
• 「コンソール」ビューにINSERT INTO user_entityのSQL文が出力されることを確認
• USER_ENTITYテーブルにレコードが1件INSERTされていることを確認
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Inject
EntityManager em;
@Test
@Transactional
public void testInsert() {
UserEntity user = UserFactory.create();
em.persist(user);
}
}
O/R Mapping
• Hibernate ToolsでリバースしたUserEntity.java
@Entity
@Table(name="USER_ENTITY")
@Access(AccessType.PROPERTY)
public class UserEntity extends BaseEntity implements java.io.Serializable {
private String userId;
private Set<GroupEntity> groupEntities = new HashSet<GroupEntity>(0);
@Id
@Column(name="USER_ID", unique=true, nullable=false, length=10)
public String getUserId() {
return this.userId;
}
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name="USER_GROUP_RELATION", schema="APP", joinColumns = {
@JoinColumn(name="USER_ID", nullable=false, updatable=false) },
inverseJoinColumns = {
@JoinColumn(name="GROUP_CODE", nullable=false, updatable=false) })
public Set<GroupEntity> getGroupEntities() {
return this.groupEntities;
}
JPA 要するに
• DBのテーブルやカラムをJavaのクラスやフィールドとして扱うフレームワーク。
• テーブル、カラムとクラス、フィールドの対応はアノテーションで定義する。(※1)
※1 xmlファイルでも定義できますが当資料では言及しません。
DB Java
テーブル @Entityのついたクラス
カラム @Entityのついたクラスのフィールド
レコード @Entityのついたクラスのインスタンス
SELECT
• UserRepositoryTest.javaにtestSelectメソッドを実装して実行
• 「コンソール」ビューにSELECT FROM user_entityのSQL文が出力されることを確認
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
public void testSelect() {
UserEntity user = em.find(UserEntity.class, "user0001");
System.out.println(user.getUserId());
}
}
UPDATE
• UserRepositoryTest.javaにtestUpdateメソッドを実装して実行
• 「コンソール」ビューにUPDATE user_entityのSQL文が出力されることを確認
• JPAではトランザクション内でManagedな状態のエンティティのプロパティを変更すると自動で
UPDATE!
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
@Transactional
public void testUpdate() {
UserEntity user = em.find(UserEntity.class, "user0001");
user.setFirstName("name");
}
}
UPDATEしない
• @Transactinalをコメントアウト、またはEntityManager.detachでUserEntityをデタッチ
• 「コンソール」ビューにUPDATE user_entityのSQL文が出力されないことを確認
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
// @Transactional
public void testUpdate() {
UserEntity user = em.find(UserEntity.class, "user0001");
em.detach(user);
user.setFirstName("name");
}
}
DELETE
• UserRepositoryTest.javaにtestDeleteメソッドを実装して実行
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
@Transactional
public void testDelete() {
UserEntity user = em.find(UserEntity.class, "user0001");
em.remove(user);
}
}
Managed
• EntityManagerから取得したEntityインスタンスはManaged
• SQLの実行タイミングはJPAが管理する。
• トランザクション内でのEntityインスタンスのプロパティ更新は、DBも更新されることを
意識しましょう!
EntityManagerのメソッド 作用
persist(Object entity) INSERTしてentityをManagedにする。
find(Class entityClass, Object primaryKey) entityClassのインスタンスを取得する。
SELECTが実行される可能性がある。
merge(Object entity) entityをManagedにする。UPDATE、または
INSERTが実行される可能性がある。
remove(Object entity) DELETEが実行される可能性がある。
CRUD
• 問題:次のtestCrudメソッドで実行されるSQLとその順番は?
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Inject
EntityManager em;
@Test
@Transactional
public void testCrud() {
UserEntity user = UserFactory.create();
em.persist(user);
UserEntity userInDb = em.find(UserEntity.class, user.getUserId());
userInDb.setFirstName("user");
em.merge(userInDb);
em.remove(userInDb);
}
}
JPQL SELECT
• UserRepositoryTest.javaにtestJpqlSelectメソッドを実装して実行
import javax.persistence.Query;
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
public void testJpqlSelect() {
Query query = em.createQuery(
"SELECT u FROM UserEntity u WHERE u.userId LIKE :userId");
query.setParameter("userId", "user%");
List<UserEntity> users = query.getResultList();
System.out.println(users.size());
}
}
JPQL JOIN – NG example
• UserRepositoryTest.javaにtestJpqlSelectメソッドを実装して実行
• UserEntity.getGroupEntities()実行時にもSELECTされる!
@Dependent
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
public void testJpqlJoin() {
Query query = em.createQuery(
"SELECT u FROM UserEntity u JOIN u.groupEntities g");
List<UserEntity> users = query.getResultList();
System.out.println(users.get(0).getGroupEntities());
}
}
FetchType
• LAZY:getしたときにSELECTする
• EAGER:初回のJPQL実行時点でJOINする
@Entity
@Table(name="USER_ENTITY")
@Access(AccessType.PROPERTY)
public class UserEntity extends BaseEntity implements java.io.Serializable {
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name="USER_GROUP_RELATION", schema="APP", joinColumns = {
@JoinColumn(name="USER_ID", nullable=false, updatable=false) },
inverseJoinColumns = {
@JoinColumn(name="GROUP_CODE", nullable=false, updatable=false) })
public Set<GroupEntity> getGroupEntities() {
return this.groupEntities;
}
JPQL JOIN – OK example
A) 関連プロパティ(groupEntities)が必要な場合
• JOINの後にFETCHをつける。FETCHの有り無しでSELECTするカラムが変わる。
B) 不要な場合
• デタッチする。
• 注意:デタッチした後に関連プロパティにアクセスすると例外が発生する。
@Dependent
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
public void testJpqlJoin() {
Query query = em.createQuery(
"SELECT u FROM UserEntity u JOIN FETCH u.groupEntities g");
List<UserEntity> users = query.getResultList();
users.stream().forEach(u -> em.detach(u));
System.out.println(users.get(0).getGroupEntities());
}
}
A)
B)
JPQL UPDATE
• Entityを使わずにUPDATEする場合はJPQLでUPDATEする。
@Dependent
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
@Transactional
public void testJpqlUpdate() {
Query query = em.createQuery(
"UPDATE UserEntity u SET u.lastName = :lastName "
+ "WHERE u.userId = :userId");
query.setParameter("lastName", "name");
query.setParameter("userId", "user0002");
System.out.println(query.executeUpdate());
}
}
JPQL 要するに
• DBのオブジェクト名をO/Rマッピング後の名前で指定するSQL
SQL JPQL
テーブル名 Entityクラス名
カラム名 Entityクラスのフィールド名
JOIN table ON JOIN entity
Native Query
• SQLを実行することも可能。
• SELECT結果をEntityとして抽出することも可能。
• 主な利用場面
• データモデルが汚すぎて職人でないとSQLが組めない。職人はJPQLを知らない。
@Dependent
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
public void testNativeQuery() {
Query query = em.createNativeQuery(
"SELECT * FROM user_entity", UserEntity.class);
List<UserEntity> result = query.getResultList();
System.out.println(result.get(0));
}
}
JPA Configuration
persistence.xml
• src/main/resources/META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="javaee7-web-tips-pu" transaction-type="JTA">
<jta-data-source>jdbc/javaee7-web-tips-ds</jta-data-source>
<properties>
<property name="eclipselink.logging.logger" value="JavaLogger" />
<property name="eclipselink.logging.level" value="FINE" />
<property name="eclipselink.logging.parameters" value="true" />
<property name="hibernate.dialect" value="${hibernate.dialect}"/>
<property name="hibernate.format_sql" value="true"/>
<property name="wildfly.jpa.default-unit" value="true"/>
</properties>
</persistence-unit>
:
:
Tips:実行SQLをロ
グ出力するように設定
persistence.xml 続き
:
:
<persistence-unit name="javaee7-web-tips-pu-non-ee-container" transaction-
type="RESOURCE_LOCAL">
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="${db.jdbc.driver}" />
<property name="javax.persistence.jdbc.url" value="${db.jdbc.url}" />
<property name="javax.persistence.jdbc.user" value="${db.username}" />
<property name="javax.persistence.jdbc.password" value="${db.password}" />
<property name="eclipselink.logging.logger" value="JavaLogger" />
<property name="eclipselink.logging.level" value="FINE" />
<property name="eclipselink.logging.parameters" value="true" />
<property name="hibernate.dialect" value="${hibernate.dialect}"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
Tips:EEコンテナー外での
設定をテスト用として同一ファ
イル内に定義(次頁)
Tips:接続情報を開発
者ごとに切り替えられるよ
うに設定
テスト用のPUは何故必要?
• Entityクラスをスキャンする範囲
• META-INF/persistence.xmlがあるディレクトリ、jarまたはwar
• Mavenの作法に則ってテスト用persistence.xmlをsrc/test/resourcesに配置すると、
Entityクラスがスキャンされない!
src
main
java
my/package/structure
MyEntity.java
resources
META-INF
persistence.xml
test
resources
META-INF
persistence.xml
target
classes
my/package/structure
MyEntity.class
META-INF
persistence.xml
test-classes
META-INF
persistence.xml
build
スキャン対象
スキャン対象外
まとめ
今回学んだこと
Category Item Point
Programming O/R Mapping DBレコードをJavaオブジェクトとして扱うための定義 DB
テーブル構造をJavaクラスにマッピング
JPQL 単純CRUD以外のDBのデータ操作はJPQLで行う
Configuration persistence.xml DB接続情報やトランザクション管理方法などJPAの設
定はpersistence.xmlで定義する
Tips DB Migration Tool DDL、DMLをチームで共有し&個々人が実行できる環
境を作る -> Flyway
Reverse Engineering Tool EntityクラスをDBスキーマからリバースエンジニアリングで
きる環境を作る -> Hibernate Tools
SQL Log 実行SQLをログに出力するようにJPAプロバイダーを設定
する
Unit Test with CDI CDI、特に宣言的トランザクションが使える単体テスト環
境を作る -> DeltaSpike
発展内容
• JPA
• O/R Mapping
• @AttributeOverride、@Inheritance、@Convert
• EntityListener
• EntityGraph
• Criteria API (APIがわかりにくいのでSIT-ADに入れるかは要検討。。)
• Shared Cache Mode
• DeltaSpike
• Data Module
• https://deltaspike.apache.org/documentation/data.html
SIT-ADの活用方法
• JPAの練習
• DDL作成
• db-migration
• JUnit
• Tipsの参照
• Flyway
• Hibernate Tools
• DeltaSpike
ご清聴ありがとうございました!
SmartなSIを!

Más contenido relacionado

La actualidad más candente

入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き土岐 孝平
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計Tadayoshi Sato
 
Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方豊明 尾古
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりVue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりYuta Ohashi
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?kwatch
 
AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較beyond Co., Ltd.
 
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53Toshiaki Maki
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Masahito Zembutsu
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
Xamarin で ReactiveUI を使ってみた
Xamarin で ReactiveUI を使ってみたXamarin で ReactiveUI を使ってみた
Xamarin で ReactiveUI を使ってみたHironov OKUYAMA
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring増田 亨
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Ryosuke Uchitate
 
PEGで構文解析をする
PEGで構文解析をするPEGで構文解析をする
PEGで構文解析をするjiro4989
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みTakeshi Ogawa
 
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャーssuser070fa9
 

La actualidad más candente (20)

入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 
Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりVue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
 
AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較AlmaLinux と Rocky Linux の誕生経緯&比較
AlmaLinux と Rocky Linux の誕生経緯&比較
 
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
Xamarin で ReactiveUI を使ってみた
Xamarin で ReactiveUI を使ってみたXamarin で ReactiveUI を使ってみた
Xamarin で ReactiveUI を使ってみた
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
 
PEGで構文解析をする
PEGで構文解析をするPEGで構文解析をする
PEGで構文解析をする
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
 
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
 

Similar a JPAの基礎と現場で役立つ開発Tips

Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Akira Inoue
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624Yusuke Suzuki
 
Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】
Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】 Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】
Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】 智治 長沢
 
ビルドプロセスとCI #STAC2014
ビルドプロセスとCI #STAC2014ビルドプロセスとCI #STAC2014
ビルドプロセスとCI #STAC2014Koji Hasegawa
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortemtamtam180
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitAtsuhiro Kubo
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/AndroidセキュアコーディングMasaki Kubo
 
実践で学ぶ、効率的な自動テストスクリプトのメンテナンス
実践で学ぶ、効率的な自動テストスクリプトのメンテナンス実践で学ぶ、効率的な自動テストスクリプトのメンテナンス
実践で学ぶ、効率的な自動テストスクリプトのメンテナンスNozomi Ito
 
Ignite ui 2012 最新情報 jQuery UI 編
Ignite ui 2012 最新情報 jQuery UI 編Ignite ui 2012 最新情報 jQuery UI 編
Ignite ui 2012 最新情報 jQuery UI 編Daizen Ikehara
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodAtsuhiro Kubo
 
How to django at first
How to django at firstHow to django at first
How to django at firstMaito Kuwahara
 
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...Akira Inoue
 
なぜソフトウェアアーキテクトが必要なのか - デブサミ2011
なぜソフトウェアアーキテクトが必要なのか - デブサミ2011なぜソフトウェアアーキテクトが必要なのか - デブサミ2011
なぜソフトウェアアーキテクトが必要なのか - デブサミ2011Yusuke Suzuki
 
テスト自動化の現場で困ること SI-Toolkitが解決すること
テスト自動化の現場で困ること SI-Toolkitが解決することテスト自動化の現場で困ること SI-Toolkitが解決すること
テスト自動化の現場で困ること SI-Toolkitが解決することyuichi_kuwahara
 
ここが変わったTizen sdk2.0alpha
ここが変わったTizen sdk2.0alphaここが変わったTizen sdk2.0alpha
ここが変わったTizen sdk2.0alphaHiroshi Sakate
 

Similar a JPAの基礎と現場で役立つ開発Tips (20)

Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】
Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】 Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】
Team Foundation Server ~ 今を生きるエンジニアのための開発基盤とは 【BPStudy #63】
 
ビルドプロセスとCI #STAC2014
ビルドプロセスとCI #STAC2014ビルドプロセスとCI #STAC2014
ビルドプロセスとCI #STAC2014
 
Ignite UI 2012 最新情報 jQuery Mobile 編
Ignite UI 2012 最新情報 jQuery Mobile 編Ignite UI 2012 最新情報 jQuery Mobile 編
Ignite UI 2012 最新情報 jQuery Mobile 編
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
 
2013 Ignite UI 最新情報 in 岡山
2013 Ignite UI 最新情報 in 岡山2013 Ignite UI 最新情報 in 岡山
2013 Ignite UI 最新情報 in 岡山
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/Androidセキュアコーディング
 
実践で学ぶ、効率的な自動テストスクリプトのメンテナンス
実践で学ぶ、効率的な自動テストスクリプトのメンテナンス実践で学ぶ、効率的な自動テストスクリプトのメンテナンス
実践で学ぶ、効率的な自動テストスクリプトのメンテナンス
 
Ignite ui 2012 最新情報 jQuery UI 編
Ignite ui 2012 最新情報 jQuery UI 編Ignite ui 2012 最新情報 jQuery UI 編
Ignite ui 2012 最新情報 jQuery UI 編
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
 
How to django at first
How to django at firstHow to django at first
How to django at first
 
Road to UI Library
Road to UI LibraryRoad to UI Library
Road to UI Library
 
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
 
なぜソフトウェアアーキテクトが必要なのか - デブサミ2011
なぜソフトウェアアーキテクトが必要なのか - デブサミ2011なぜソフトウェアアーキテクトが必要なのか - デブサミ2011
なぜソフトウェアアーキテクトが必要なのか - デブサミ2011
 
Ldd13 present
Ldd13 presentLdd13 present
Ldd13 present
 
テスト自動化の現場で困ること SI-Toolkitが解決すること
テスト自動化の現場で困ること SI-Toolkitが解決することテスト自動化の現場で困ること SI-Toolkitが解決すること
テスト自動化の現場で困ること SI-Toolkitが解決すること
 
ここが変わったTizen sdk2.0alpha
ここが変わったTizen sdk2.0alphaここが変わったTizen sdk2.0alpha
ここが変わったTizen sdk2.0alpha
 

Último

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 

Último (10)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 

JPAの基礎と現場で役立つ開発Tips