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結構面白そう。