persistance.xml の編集
- homework - src/main/java - META-INF にある persistence.xml をダブルクリックします。
- 「一般」タブの「永続化プロバイダー」に wildfly を使用するので、org.hibernate.jpa.HibernatePersistenceProvider を入力します。
- 「接続」タブで、とりあえずコンテナなしでも確認できるように、「トランザクション・タイプ」は「リソース・ローカル」を選択します。
- 「JDBC接続プロパティー」は「接続から取り込み」リンクをクリックして、homework を選択して「OK」ボタンをクリックします。
- 「プロパティー」タブでは、JPAのログを表示するためにキーに hibernate.show_sql, hibernate.format_sql を追加し、値はどちらも true を設定します。(検索にヒットするのは EclipseLink での設定が多かった…)
- JDBCレベルのログを出力させたいので、javax.persistence.jdbc.url は jdbc:mysql://localhost:3306/homework から jdbc:log4jdbc:mysql://localhost:3306/homework に、javax.persistence.jdbc.driver は com.mysql.jdbc.Driver から net.sf.log4jdbc.sql.jdbcapi.DriverSpy に変更します。
JPQLの外部ファイル化
各種エンティティに @NamedQuery で JPQL を記述すると、再作成したときに消えてしまうし、一カ所で管理したかったので、外部ファイルに記述するようにします。
- src/main/resources で右クリック-「新規」-「ファイル」を選択します。
- ファイル名に homework.xml と入力して「完了」ボタンをクリックします。
以下のようなフォーマットで named-query を必要な分だけ追加していきます。
homework.xml
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd">
<named-query name="呼び出すときの名前">
<query><![CDATA[
SELECT
u
FROM
User u
WHERE
u.accountId = :accountId
AND
u.password = :password
]]></query>
</named-query>
</entity-mappings>
外部ファイルの指定
mapping-file タグで homework.xml を指定します。
単体テスト用の設定を追記
データベースを本番用と単体テスト用とに分けたいので、persistence-unit を丸ごとコピペして name 属性と、接続URLを変更します。
現時点での最終的なファイルの内容は以下のようになります。
(本番用はJTAの指定に切り替える予定)
persistance.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="homework" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<mapping-file>homework.xml</mapping-file>
<class>homework.entity.Answer</class>
<class>homework.entity.History</class>
<class>homework.entity.Question</class>
<class>homework.entity.Subject</class>
<class>homework.entity.User</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:log4jdbc:mysql://localhost:3306/homework"/>
<property name="javax.persistence.jdbc.user" value="db_user"/>
<property name="javax.persistence.jdbc.password" value="db_pass"/>
<property name="javax.persistence.jdbc.driver" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
<persistence-unit name="homework_ut" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<mapping-file>homework.xml</mapping-file>
<class>homework.entity.Answer</class>
<class>homework.entity.History</class>
<class>homework.entity.Question</class>
<class>homework.entity.Subject</class>
<class>homework.entity.User</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:log4jdbc:mysql://localhost:3306/homework_ut"/>
<property name="javax.persistence.jdbc.user" value="db_user"/>
<property name="javax.persistence.jdbc.password" value="db_pass"/>
<property name="javax.persistence.jdbc.driver" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>