Java EE 7 検証環境構築(6) JPA エンティティの作成と挿入

  1. Java EE 7 検証環境構築(1) WildFly + JBoss Tools で EARプロジェクトを作成し Arquillian で ユニットテストをグリーンにするところまで
  2. Java EE 7 検証環境構築(2) WildFly に DataSourceを作成
  3. Java EE 7 検証環境構築(3) JPAからMySQLに接続するユニットテストをArquillianで実行
  4. Java EE 7 検証環境構築(4) Java EE での DI(Dependency Injection) および CDI(Contexts and Dependency Injection)をながめる
  5. Java EE 7 検証環境構築(5) JBoss Toolsが生成したサンプルソースのCDIを確認する
  6. Java EE 7 検証環境構築(6) JPA エンティティの作成と挿入
  7. Java EE 7 検証環境構築(7) JPA 問い合わせ(1) 名前付きクエリを使ってみる。テストでトランザクションも意識する
  8. Java EE 7 検証環境構築(8) JPA 問い合わせ(2) 動的クエリとCriteria API を試す
  9. Java EE 7 検証環境構築(9) jBatch 概要をおさえる
  10. Java EE 7 検証環境構築(10) JBoss Tools で作成した EARプロジェクトをJava EE 6 から 7 に変更する
  11. Java EE 7 検証環境構築(11) jBatch用 プロジェクトの作成を行う
  12. Java EE 7 検証環境構築(12) jBatch 簡易サンプル作成と Arquillian でユニットテスト
  13. Java EE 7 検証環境構築(13) jBatch REST サービス経由で実行する
  14. Java EE 7 検証環境構築(14) WildFly の管理をGUIで行う
  15. Java EE 7 検証環境構築(15) WildFly を サービスとして設定する(Windows/Linux)
  16. 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アノテーションを付加する。

  1. @Entity付与 でエンティティであることを認識させる
  2. @Id付与 で主キー設定
  3. @GeneratedValue で識別子の値を自動生成させる
  4. @Column でデフォルトのカラムマッピングをカスタマイズ

Bookエンティティを作成する。

  1. @Entity
  2. public class Book {
  3.  
  4. @Id
  5. @GeneratedValue
  6. private Long id;
  7. @Column(nullable=false)
  8. private String title;
  9. private Float price;
  10. @Column(length=2000)
  11. private String description;
  12. private String isbn;
  13. private Integer nbOfPage;
  14. private Boolean illustrations;
  15. : コンストラクタ、ゲッター、セッター省略
  16. }

1.2 サービスクラス(ステートレスセッションBean) を作成

Bookエンティティを操作するサービスクラスを作成してみる。

上記の本に書かれている訳ではない。

@Inject で、Logger と JPAの主役であるEntityManagerがインジェクトされているのは、CDIの仕組みによっている。

Java EE 7 検証環境構築(5) JBoss Toolsが生成したサンプルソースのCDIを確認する

  1. @Stateless
  2. public class BookService {
  3.  
  4. @Inject
  5. private Logger log;
  6.  
  7. @Inject
  8. private EntityManager em;
  9. public void insertBook(Book book) {
  10. em.persist(book);
  11. }
  12. }

1.3 Arquillian でユニットテストを実行

Java EE 7 検証環境構築(3) JPAからMySQLに接続するユニットテストをArquillianで実行

単純にBookエンティティを挿入してみる。

  1. @RunWith(Arquillian.class)
  2. public class BookServiceTest {
  3. @Deployment
  4. public static Archive<?> createTestArchive() {
  5. return ShrinkWrap.create(WebArchive.class, "test.war")
  6. .addClass(Resources.class)
  7. .addClass(Book.class)
  8. .addClass(BookService.class)
  9. .addAsResource("META-INF/test-persistence.xml", "META-INF/persistence.xml")
  10. .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")
  11. ;
  12. }
  13.  
  14. @Inject
  15. Logger log;
  16.  
  17. @Inject
  18. BookService bookService;
  19. @Test
  20. public void insertBookTest() {
  21. Book book = new Book();
  22. book.setTitle("Test Book");
  23. book.setPrice(150f);
  24. book.setDescription("this is test book.");
  25. bookService.insertBook(book);
  26. }
  27. }

JPAがはき出すSQL

  1. 10:28:44,068 INFO [org.hibernate.tool.hbm2ddl.SchemaExport] (ServerService Thread Pool -- 20) HHH000227: Running hbm2ddl schema export
  2. 10:28:44,072 INFO [stdout] (ServerService Thread Pool -- 20) Hibernate: drop table if exists Book
  3. 10:28:44,089 INFO [stdout] (ServerService Thread Pool -- 20) Hibernate: drop table if exists hibernate_sequence
  4. 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))
  5. 10:28:45,221 INFO [stdout] (ServerService Thread Pool -- 20) Hibernate: create table hibernate_sequence ( next_val bigint )
  6. 10:28:45,825 INFO [stdout] (ServerService Thread Pool -- 20) Hibernate: insert into hibernate_sequence values ( 1 )
  7. 10:28:50,408 INFO [stdout] (default task-1) Hibernate: select next_val as id_val from hibernate_sequence for update
  8. 10:28:50,423 INFO [stdout] (default task-1) Hibernate: update hibernate_sequence set next_val= ? where next_val=?
  9. 10:28:50,574 INFO [stdout] (default task-1) Hibernate: insert into Book (description, illustrations, isbn, nbOfPage, price, title, id) values (?, ?, ?, ?, ?, ?, ?)

テスト成功

jpa_junit01

1.4 MySQL に接続して、どのようなDDLが生成されたか見てみる

@Column で指定しないと、デフォルトの桁数などが使用されているのが見て取れる。

  1. PS C:\Users\piroto> mysql -u root -p
  2. Enter password: ********
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 12
  5. Server version: 5.6.17 MySQL Community Server (GPL)
  6.  
  7. Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
  8.  
  9. Oracle is a registered trademark of Oracle Corporation and/or its
  10. affiliates. Other names may be trademarks of their respective
  11. owners.
  12.  
  13. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  14.  
  15. mysql> use tallarico
  16. Database changed
  17. mysql> show tables;
  18. +---------------------+
  19. | Tables_in_tallarico |
  20. +---------------------+
  21. | book |
  22. | hibernate_sequence |
  23. | registrant |
  24. +---------------------+
  25. 3 rows in set (0.00 sec)
  26.  
  27. mysql> show create table book;
  28. +-------+-------------------------------------
  29. | Table | Create Table
  30. +-------+-------------------------------------
  31. | book | CREATE TABLE `book` (
  32. `id` bigint(20) NOT NULL,
  33. `description` longtext,
  34. `illustrations` bit(1) DEFAULT NULL,
  35. `isbn` varchar(255) DEFAULT NULL,
  36. `nbOfPage` int(11) DEFAULT NULL,
  37. `price` float DEFAULT NULL,
  38. `title` varchar(255) NOT NULL,
  39. PRIMARY KEY (`id`)
  40. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
  41. +-------+-------------------------------------
  42. 1 row in set (0.00 sec)

WildFly では、デフォルトのJPA実装は Hibernte ということ(HibernateがJPAインターフェースを備えている)で、少し古いが以下の本を購入してみた。読了はしていないが、前半部分だけでも、かなり良書。ORMとはなんたるかがよくわかる。

今までかなりORMを誤解していた部分があった。ORM結構面白そう。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です