[Java] 45. JPAを設定する方法


Study / Java    作成日付 : 2019/10/10 07:29:43   修正日付 : 2021/06/11 10:14:12

こんにちは。明月です。


この投稿はJPAを設定する方法に関する説明です。


Javaプログラムでデータベースのコネクション管理するフレームワークがあります。そのフレームワークを我々はORM(Object-relational-mapping)といいます。

以前、ORMフレームワークを使わなかった時、または使用頻度が少なかった時にはプログラムでSQL Connectionを組み立てソースに直接にSQLクエリを作成してデータベースからデータを取得しました。


その方法はプログラム管理する時に様々な問題があります。

例えば、データベースのテーブルを修正した場合、SQLクエリをStringタイプで作成したのでプログラムのコンパイルエラーやデバッグエラーが発生しません。そのため、大きいプロジェクトだっと思えば各SQLクエリを修正することがずいぶん大変だったんです。

また、Stringで作成したことなので、もしかして修正漏れがある場合、デバッグエラーで取れないので、実行中でエラーが発生します。


他の問題はReference管理です。SQLクエリ上でテーブル間にJoinして結果に合わせてEntityクラスを作成します。でも、Joinの状況によりクラスがたくさん生成される結果になります。そうすればクラスが多くなって管理が大変になるし、テーブル修正がある場合に作業が多いです。


個人的にこの2つの問題を解決するしデータベースのツリー構造のデータをプログラムのクラスタイプの連結リストタイプの構造に変換するフレームワークをORMフレームワークといいます。


JavaののORMフレームワークは種類が多いです。Hibernateということもあるし、DomaのSeasorということもあります。私の場合は昔ibatisというフレームワークも使ったことがあります。

いつからかは知りませんが、Java側ではJPA(Java Persistence API)というフレームワークがJavaの標準ORMに指定されました。最近はJava IDEツールのeclipseでJPAフレームワークを扱いやすく支援しています。

なので最近の雰囲気はJPAをORMに選択して使うことが標準になっています。


JPAを使うためにはmavenでライブラリを連結しなければならないです。

「pom.xml」で2つのライブラリを連結しましょう。

<!-- https://mvnrepository.com/artifact/org.eclipse.persistence/org.eclipse.persistence.jpa -->
<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>org.eclipse.persistence.jpa</artifactId>
  <version>2.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.41</version>
</dependency>

一番目のdependencyはJPAライブラリです。二番目のdependencyはmysql-connectorです。

私の場合はmariaDB(mysql)を使いつもりでmysql-connectorを連結しましたが、他のデータベースを使うならこのconnectorライブラリを当該なデータベースのライブラリに変わったらよいです。


projectでjpa projectで変換しましょう。

Platfromとconnectionを設定しましょう。

そしてadd connectionリンクを押下してeclipseのデータベースのコネクションを設定しなければならないです。以前に「eclipse」で「mariaDB(mysql)」を接続したことがなければ設定しなければならないです。

connectorの場合はmavenでupdateをしてライブラリをダウンロードしたことがあればmaven repositoryディレクトリにjarファイルがあります。

別にmaven設定をしなかったら、c:\(ウィンドウユーザパス)\.m2\repository\mysql\mysql-connector-java\5.1.41にあります。

コネクション連結が終わったらPlatformをEclipse 2.5.xに設定してtypeをDisable Library Configurationを設定します。

そして連結確認をした後にFinishボタンを押下するとsrc\META-INF\persistence.xmlが生成されています。


Javaプロジェクトでデータベースを連結して使うためにデータベースに優先テーブルを作成して連結しましょう。

-- test データベースに接続
use test;
-- 以前にテーブルがあれば一応削除
-- drop table info;
-- drop table user;
-- userテーブル生成
create table user(
  id varchar(255) not null,
  name nvarchar(255) not null,

  primary key(id) - キー設定
);
-- info テーブル生成
create table info(
  idx int not null auto_increment, -- 自動増加
  id varchar(255) not null,
  age int not null,

  primary key(idx), -- キー設定
  foreign key(id) references user(id) -- idはuserのidで連結
);

次は「persistence.xml」で戻ってコネクション情報を入力します。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
              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">
  <persistence-unit name="JpaExample">
    <properties>
      <!-- キャッシュ機能。これが「true」になっているとこのフレームワークを通ってないクエリは反映が遅くなる。 -->
      <property name="eclipselink.query-results-cache" value="false" />
      <!-- データベースの連結上のログレベル設定 -->
      <property name="eclipselink.logging.level" value="INFO" />
      <property name="eclipselink.logging.parameters" value="true" />
      <!-- driver パッケージ設定 -->
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
      <!-- database 設定 -->
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test" />
      <!-- 接続id -->
      <property name="javax.persistence.jdbc.user" value="id" />
      <!-- 接続password -->
      <property name="javax.persistence.jdbc.password" value="password" />
    </properties>
  </persistence-unit>
</persistence>

persistence.xml設定を終わったらEntityクラスを作りましょう。

Entityクラスとはテーブルのデータを格納するためのデータクラスです。




データベースのテーブルがclassで作成されました。これから実際データベースからデータを取得しましょう。

-- userテーブルにデータを挿入
insert into user (id,name) values('nowonbun','Hello');
-- info テーブルにデータを挿入
insert into info(id,age) values('nowonbun',20);

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import model.User;
import model.Info;
// 実行関数があるクラス
public class Main {
  // 実行関数
  public static void main(String... args) {
    // FactoryManagerを生成する。JpaExampleはpersistence.xmlに宣言した名だ。
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("JpaExample");
    try {
      // Managerを生成する。
      EntityManager em = emf.createEntityManager();
      try {
        // UserテーブルでnowonbunUserのIDを取得。
        User user = em.find(User.class, "nowonbun");
        // コンソール出力
        System.out.println(user.getName());
        // Userテーブルで連結しているInfoテーブルのデータを取得。
        List infos = user.getInfos();
        for (Info info : infos) {
          // コンソール出力
          System.out.println(info.getAge());
        }
      } finally {
        // Managerを閉める。
        em.close();
      }
    } finally {
      // FactoryManagerを閉める。
      emf.close();
    }
  }
}


ここまで基本「JPA」設定が完了しました。データベースからデータを取得してコンソールに出力することまで確認しました。


ここまで基本JPA設定は完了しましたが、実際のプロジェクトに使うようには様々な設定が必要です。具体的な設定する方法は次の投稿で説明します。


ここまでJPAを設定する方法に関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

Study / Java」の他投稿
最新投稿