Help us understand the problem. What is going on with this article?

Spring Data とJPAの利用するまで その2

More than 1 year has passed since last update.

結構、設定の難易度が高め。

前回の続き

取りあえず前はSpringを使ってDBとの接続をしました。
ここからはJPAという本格的なDB操作フレームワークを使います。

目標を分ける

1.SQLとつなぐだけに必要なもの
 ・Hibernate EntityManagerライブラリ
 ・Spring JDBCライブラリ
 ・データベースのドライバ ポスグレとかH2とか
 ・プロパティファイル
 ・Bean構成ファイル(xml) 今回はJavaConfigを使わないです。 多分、かえってややこしくなりそう ←ここまで

2.加えてJPAに必要なもの  ←ここから
 ・Spring Data JPAライブラリ
 ・エンティティクラス
 ・persistance.xmlファイル(Java EJBの機能)
 ・Bean構成ファイル(xml)
 ・mainメソッドを持った実行クラス

ライブラリの追加

例のごとくライブラリの追加。
Springで新しい機能を使う時は大体ライブラリを編集しますね

pom.xml
        <!-- Spring Data JPA -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
        </dependency>

        <!-- Spring ORM -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>

保存したらMaven→updateProject

エンティティクラス

テーブルからエンティティクラスを作成する方法はこちらから。
要約
右クリして構成からJPAプロジェクトに変換してね。
JPAプロジェクトになったらテーブルからエンティティが自動生成するよ。

https://qiita.com/shibafu/items/39f3f5d6e63dda16bb12

凄まじく見づらいけど、

image.png

Entityが出来たら@Idとかアノテーションをつけてエラーを取ってあげましょう。
lombokを使って、@Dataでゲッターセッターを省略するのもいいかも

自動実装されたエンティティクラス

image.png

persistance.xmlの作成

src/main/resourcesにMETA-INFフォルダと中にpersistance.xmlファイルを作ります。
永続性ファイルというJava-EEの機能らしいです
(JPAで作成した場合はsrc/main/java内に出来てるので、移動して)

見取り図
src/main/resources/
  |
  |---META-INF
  |    |
  |    |--persistance.xml
  |---bean.xml
  |---database.properties   

persitance.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="persistance-unit">

        <!-- HibernatePersistance定義 -->
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>model.Mypersonaldata</class>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>

            <property name="hibernate.hbm2ddl.auto" value="create" />

                <!-- ドライバーのプロパティ -->
                <property name="javax.persistance.jdbc.driver"
                    value="${jdbc.driverClassname}" />
                <property name="javax.persistance.jdbc.url"
                    value="${jdbc.url}" />
                <property name="javax.persistance.jdbc.user"
                    value="${jdbc.username}" />
                <property name="javax.persistance.jdbc.password"
                    value="${jdbc.password}" /> 
        </properties>
    </persistence-unit>
</persistence>

image.png

Bean構成ファイルの作成

最後にBean構成ファイルを作成します。
名前空間 xmlns= http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/spring-jpa.xsd
を追加して
エンティティマネージャーをDIコンテナに登録します。

bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/data/jpa
     http://www.springframework.org/schema/data/spring-jpa.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context.xsd
     http://www.springframework.org/schema/jdbc
     http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
     http://www.springframework.org/schema/tx
     http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">


    <!-- 組み込みデータベース用の設定>
    <jdbc:embedded-database id="dataSource" type="H2">
        <jdbc:script location="classpath:script.sql"/>
    </jdbc:embedded-database-->

    <!-- データベースプロパティの設定 -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="database.properties" />
    </bean>

    <!-- EntityManagerの設定 -->
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="generateDdl" value="true" />
            </bean>
        </property>
    </bean>

    <!-- DB接続用の設定 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <!-- JDBCテンプレートBeanの作成 -->
    <bean class="org.springframework.jdbc.core.JdbcTemplate">
        <constructor-arg ref="dataSource" />
    </bean>


        <!-- JPA Repository 設定 -->
    <jpa:repositories base-package="com.TsugaruInfo.repository" />

     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
        <property name="dataSource" ref="dataSource" />
    </bean>
</beans>


レッツ実行

メインクラスにエンティティマネージャーを置いて、JPAの機能を実行しましょう!

App.java
public class App{
    public static void main(String args[]) {

        //アノテーションを用いたテンプレートの作成
        //context = new AnnotationConfigApplicationContext(DataSourceConfig.class);
        //JdbcTemplate jdbcTemplate = (JdbcTemplate)context.getBean(JdbcTemplate.class);
        //コンテキスト取得
//      context = new ClassPathXmlApplicationContext("bean.xml");
//      jdbcTemplate = context.getBean(JdbcTemplate.class);

        context = new ClassPathXmlApplicationContext("bean.xml");

        LocalContainerEntityManagerFactoryBean factory =
                context.getBean(LocalContainerEntityManagerFactoryBean.class);
        manager = factory.getNativeEntityManagerFactory().createEntityManager();

        Mypersonaldata data = manager.find(Mypersonaldata.class, 1);

            System.out.println(data);

    }
}

これをJavaApplicationから実行

image.png

一番下に、postgresqlから読み込んだデータが表示されているのが分かると思います。

まとめ。

まぁ、Spring-Bootだと、この手続きを全部自動でやってくれるんですが、
基本を抑えてなくて動かなくなったので、参考までに。

shibafu
仙台のJavaプログラマ SpringFrameworkが大好き プログラミングはいつも初学者
https://msdnaart.net/@pratula_admin
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away