.. include:: ../../../module.txt
.. _section1-springdata-jpa-introduction-label:
Introduction
=====================================================
Spring Data JPAは Spring Frameworkを使用したアプリケーションで、JPAを用いたデータベースアクセス処理において、
データベースアクセスに関わるボイラープレートコードを排除し、処理の記述を簡易化するフレームワークである。
主な特徴は以下の通り挙げられる。
* Spring FrameworkとJPAをベースとしたレポジトリの洗練されたサポート
* QueryDSLとタイプセーフなJPAクエリ記述のサポート
* ドメインクラスの透過的な監視
* ページネーション、動的なクエリの実行、カスタムデータアクセスの統合
* 起動時における@Queryアノテーションを付与したクエリの検証
* XMLベースのエンティティマッピングのサポート
* @EnableJpaRepositoriesを基調としたJavaConfigの設定
今回、以下の環境で簡単な動作検証を実施した。
.. _section1-1-springdata-jpa-environment-label:
動作環境
-----------------------------------------------------
[OS] |br|
MacOSX 10.9.5
[JVM] |br|
Java(TM) SE Runtime Environment (build 1.8.0_40-b27) Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)
[Spring] |br|
Spring Framework 4.3.2.RELEASE |br|
Spring Framework Data 1.10.2.RELEASE |br|
Spring Framework Boot 1.4.0.RELEASE| br|
[JPA]|br|
JPA2.1
.. _section1-2-springdata-jpa-settings-label:
事前準備
-------------------------------------------------------
.. _section1-2-1-springdata-jpa-settings-pom-label:
pom.xmlの設定
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Mavenプロジェクトに以下のライブラリを追加しておく。Lombokを追加しているが、こちらは任意である。本ドキュメントでは、これらのライブラリを利用したコードが出てくるので注意すること。
.. sourcecode:: xml
:caption: pom.xml
:linenos:
org.springframework.boot
spring-boot-starter-parent
1.4.0.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-data-jpa
org.hsqldb
hsqldb
org.projectlombok
lombok
provided
org.springframework.boot
spring-boot-maven-plugin
.. _section1-2-1-springdata-jpa-settings-database-label:
テーブルの構築
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
本サンプルでは、以下のようなテーブルを構成している。
.. figure:: img/sample.png
:scale: 100%
テーブル構成は以下の通りである。
.. list-table:: テーブルの構成
:header-rows: 1
:widths: 30,20,30,50
* - テーブル
- エンティティクラス名
- 論理名
- ユーザとの関係
* - USR
- User
- ユーザ
- −
* - GRP
- Group
- グループ
- 所属テーブルを介して多対多関連
* - ADDRESS
- Address
- 住所
- 一対一関連
* - EMAIL
- Email
- メール
- 一対多関連
* - AFFILIATION
- Affiliation
- 所属
- ユーザとグループの関連実体
.. sourcecode:: sql
:caption: src/main/resource/ddl/sample.sql
/* Drop Tables */
DROP TABLE IF EXISTS ADDRESS;
DROP TABLE IF EXISTS AFFILIATION;
DROP TABLE IF EXISTS EMAIL;
DROP TABLE IF EXISTS GRP;
DROP TABLE IF EXISTS USR;
/* Create Tables */
CREATE TABLE ADDRESS
(
USER_ID varchar(8) NOT NULL,
ZIP_CD char(8),
ADDRESS varchar(255),
VER int,
LAST_UPDATED_DATE timestamp,
PRIMARY KEY (USER_ID)
);
CREATE TABLE AFFILIATION
(
GROUP_ID char(10) NOT NULL,
USER_ID varchar(8) NOT NULL,
VER int,
LAST_UPDATED_DATE timestamp,
PRIMARY KEY (GROUP_ID, USER_ID),
);
CREATE TABLE EMAIL
(
USER_ID varchar(8) NOT NULL,
EMAIL_ID varchar(255) NOT NULL,
EMAIL varchar(255),
VER int,
LAST_UPDATED_DATE timestamp,
PRIMARY KEY (USER_ID, EMAIL_ID),
);
CREATE TABLE GRP
(
GROUP_ID char(10) NOT NULL,
GROUP_NAME varchar(50),
VER int,
LAST_UPDATED_DATE timestamp,
PRIMARY KEY (GROUP_ID)
);
CREATE TABLE USR
(
USER_ID varchar(8) NOT NULL,
USER_NAME varchar(50),
LOGIN_ID varchar(64),
VER int,
LAST_UPDATED_DATE timestamp,
PRIMARY KEY (USER_ID)
);
/* Create Foreign Keys */
ALTER TABLE AFFILIATION
ADD FOREIGN KEY (GROUP_ID)
REFERENCES GRP (GROUP_ID)
ON UPDATE RESTRICT
ON DELETE RESTRICT
;
ALTER TABLE ADDRESS
ADD FOREIGN KEY (USER_ID)
REFERENCES USR (USER_ID)
ON UPDATE RESTRICT
ON DELETE RESTRICT
;
ALTER TABLE AFFILIATION
ADD FOREIGN KEY (USER_ID)
REFERENCES USR (USER_ID)
ON UPDATE RESTRICT
ON DELETE RESTRICT
;
ALTER TABLE EMAIL
ADD FOREIGN KEY (USER_ID)
REFERENCES USR (USER_ID)
ON UPDATE RESTRICT
ON DELETE RESTRICT
;
.. sourcecode:: sql
:caption: src/main/resource/ddl/data.sql
DELETE FROM ADDRESS;
DELETE FROM AFFILIATION;
DELETE FROM EMAIL;
DELETE FROM GRP;
DELETE FROM USR;
INSERT INTO USR VALUES ('00000000', '(ΦωΦ)', 'org.debugroom.test1', 0, '2015-01-01 00:00:00.0');
INSERT INTO USR VALUES ('00000001', '(・∀・)', 'org.debugroom.test2', 0, '2015-01-01 00:00:00.0');
INSERT INTO USR VALUES ('00000002', '(・ω・`)', 'org.debugroom.test3', 0, '2015-01-01 00:00:00.0');
INSERT INTO GRP VALUES ('0000000000', 'org.debugroom', 0, '2015-01-01 00:00:00.0');
INSERT INTO GRP VALUES ('0000000001', 'nttdata', 0, '2015-01-01 00:00:00.0');
INSERT INTO EMAIL VALUES('00000000', 1, 'test@test.co.jp', 0, '2015-01-01 00:00:00.0');
INSERT INTO EMAIL VALUES('00000000', 2, 'test@test.com', 0, '2015-01-01 00:00:00.0');
INSERT INTO EMAIL VALUES('00000001', 1, 'test@test.ne.jp', 0, '2015-01-01 00:00:00.0');
INSERT INTO AFFILIATION VALUES('0000000000', '00000000', 0, '2015-01-01 00:00:00.0');
INSERT INTO AFFILIATION VALUES('0000000000', '00000001', 0, '2015-01-01 00:00:00.0');
INSERT INTO AFFILIATION VALUES('0000000001', '00000001', 0, '2015-01-01 00:00:00.0');
INSERT INTO AFFILIATION VALUES('0000000001', '00000002', 0, '2015-01-01 00:00:00.0');
INSERT INTO ADDRESS VALUES ('00000000', '135-8671', '東京都江東区豊洲3-3-3', 0, '2015-01-01 00:00:00.0');
INSERT INTO ADDRESS VALUES ('00000001', '135-8671', '東京都江東区豊洲3-3-9', 0, '2015-01-01 00:00:00.0');
INSERT INTO ADDRESS VALUES ('00000002', '135-8671', '東京都江東区豊洲3-3-19', 0, '2015-01-01 00:00:00.0');