Java EE 7 検証環境構築(6) JPA エンティティの作成と挿入
- Java EE 7 検証環境構築(1) WildFly + JBoss Tools で EARプロジェクトを作成し Arquillian で ユニットテストをグリーンにするところまで
- Java EE 7 検証環境構築(2) WildFly に DataSourceを作成
- Java EE 7 検証環境構築(3) JPAからMySQLに接続するユニットテストをArquillianで実行
- Java EE 7 検証環境構築(4) Java EE での DI(Dependency Injection) および CDI(Contexts and Dependency Injection)をながめる
- Java EE 7 検証環境構築(5) JBoss Toolsが生成したサンプルソースのCDIを確認する
- Java EE 7 検証環境構築(6) JPA エンティティの作成と挿入
- Java EE 7 検証環境構築(7) JPA 問い合わせ(1) 名前付きクエリを使ってみる。テストでトランザクションも意識する
- Java EE 7 検証環境構築(8) JPA 問い合わせ(2) 動的クエリとCriteria API を試す
- Java EE 7 検証環境構築(9) jBatch 概要をおさえる
- Java EE 7 検証環境構築(10) JBoss Tools で作成した EARプロジェクトをJava EE 6 から 7 に変更する
- Java EE 7 検証環境構築(11) jBatch用 プロジェクトの作成を行う
- Java EE 7 検証環境構築(12) jBatch 簡易サンプル作成と Arquillian でユニットテスト
- Java EE 7 検証環境構築(13) jBatch REST サービス経由で実行する
- Java EE 7 検証環境構築(14) WildFly の管理をGUIで行う
- Java EE 7 検証環境構築(15) WildFly を サービスとして設定する(Windows/Linux)
- Java EE 7 検証環境構築(16) WildFly と Apache を mod_jk で連携させる(Widows)
ここまでで、基本的に動作させることが出来るようになったので、JPA 周りの動きを見ていきたい。
CDIについての記述は物足りないにもほどがあったが、JPAについてはこの本の説明がわかりやすかった。
Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava (Programmer’s SELECTION)
環境を GlassFish から WildFly に変更したので、適宜読み替えながら、上記本の記述をかいつまみながら追っていこうと思う。
1.JPAの永続化を試してみる
1.1 エンティティの作成
だいたい、以下の様なJPAアノテーションを付加する。
- @Entity付与 でエンティティであることを認識させる
- @Id付与 で主キー設定
- @GeneratedValue で識別子の値を自動生成させる
- @Column でデフォルトのカラムマッピングをカスタマイズ
Bookエンティティを作成する。
@Entity public class Book { @Id @GeneratedValue private Long id; @Column(nullable=false) private String title; private Float price; @Column(length=2000) private String description; private String isbn; private Integer nbOfPage; private Boolean illustrations; : コンストラクタ、ゲッター、セッター省略 }
1.2 サービスクラス(ステートレスセッションBean) を作成
Bookエンティティを操作するサービスクラスを作成してみる。
上記の本に書かれている訳ではない。
@Inject で、Logger と JPAの主役であるEntityManagerがインジェクトされているのは、CDIの仕組みによっている。
Java EE 7 検証環境構築(5) JBoss Toolsが生成したサンプルソースのCDIを確認する
@Stateless public class BookService { @Inject private Logger log; @Inject private EntityManager em; public void insertBook(Book book) { em.persist(book); } }
1.3 Arquillian でユニットテストを実行
Java EE 7 検証環境構築(3) JPAからMySQLに接続するユニットテストをArquillianで実行
単純にBookエンティティを挿入してみる。
@RunWith(Arquillian.class) public class BookServiceTest { @Deployment public static Archive<?> createTestArchive() { return ShrinkWrap.create(WebArchive.class, "test.war") .addClass(Resources.class) .addClass(Book.class) .addClass(BookService.class) .addAsResource("META-INF/test-persistence.xml", "META-INF/persistence.xml") .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") ; } @Inject Logger log; @Inject BookService bookService; @Test public void insertBookTest() { Book book = new Book(); book.setTitle("Test Book"); book.setPrice(150f); book.setDescription("this is test book."); bookService.insertBook(book); } }
JPAがはき出すSQL
10:28:44,068 INFO [org.hibernate.tool.hbm2ddl.SchemaExport] (ServerService Thread Pool -- 20) HHH000227: Running hbm2ddl schema export 10:28:44,072 INFO [stdout] (ServerService Thread Pool -- 20) Hibernate: drop table if exists Book 10:28:44,089 INFO [stdout] (ServerService Thread Pool -- 20) Hibernate: drop table if exists hibernate_sequence 10:28:44,506 INFO [stdout] (ServerService Thread Pool -- 20) Hibernate: create table Book (id bigint not null, description longtext, illustrations bit, isbn varchar(255), nbOfPage integer, price float, title varchar(255) not null, primary key (id)) 10:28:45,221 INFO [stdout] (ServerService Thread Pool -- 20) Hibernate: create table hibernate_sequence ( next_val bigint ) 10:28:45,825 INFO [stdout] (ServerService Thread Pool -- 20) Hibernate: insert into hibernate_sequence values ( 1 ) 10:28:50,408 INFO [stdout] (default task-1) Hibernate: select next_val as id_val from hibernate_sequence for update 10:28:50,423 INFO [stdout] (default task-1) Hibernate: update hibernate_sequence set next_val= ? where next_val=? 10:28:50,574 INFO [stdout] (default task-1) Hibernate: insert into Book (description, illustrations, isbn, nbOfPage, price, title, id) values (?, ?, ?, ?, ?, ?, ?)
テスト成功
1.4 MySQL に接続して、どのようなDDLが生成されたか見てみる
@Column で指定しないと、デフォルトの桁数などが使用されているのが見て取れる。
PS C:\Users\piroto> mysql -u root -p Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 Server version: 5.6.17 MySQL Community Server (GPL) Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use tallarico Database changed mysql> show tables; +---------------------+ | Tables_in_tallarico | +---------------------+ | book | | hibernate_sequence | | registrant | +---------------------+ 3 rows in set (0.00 sec) mysql> show create table book; +-------+------------------------------------- | Table | Create Table +-------+------------------------------------- | book | CREATE TABLE `book` ( `id` bigint(20) NOT NULL, `description` longtext, `illustrations` bit(1) DEFAULT NULL, `isbn` varchar(255) DEFAULT NULL, `nbOfPage` int(11) DEFAULT NULL, `price` float DEFAULT NULL, `title` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 +-------+------------------------------------- 1 row in set (0.00 sec)
WildFly では、デフォルトのJPA実装は Hibernte ということ(HibernateがJPAインターフェースを備えている)で、少し古いが以下の本を購入してみた。読了はしていないが、前半部分だけでも、かなり良書。ORMとはなんたるかがよくわかる。
今までかなりORMを誤解していた部分があった。ORM結構面白そう。