WildFly8.1でJPAのデータソースを間接参照する方法
WildFly8.1でJPAのデータソースを環境名前空間を使って間接参照する方法です。
WASなんかだと特に何も考えなくても勝手に動いてしまうのですが、WildFlyでは一捻り必要だったので記録しておきます。
問題点
JPAの<jta-datasource />
でWildFlyに設定したデータソースのJNDI名をそのまま指定したくない(理由は省略)ので、java:app
といったローカルな環境名前空間を指定したが、アプリケーションをデプロイするとエラーが出て動作しない。
動かないのは以下のような設定です。
application.xml
<?xml version="1.0" encoding="UTF-8"?> <application xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/application_7.xsd" version="7"> <display-name>test-ear</display-name> <module> <web> <web-uri>test-0.0.1-SNAPSHOT.war</web-uri> <context-root>/test</context-root> </web> </module> <library-directory>lib</library-directory> <resource-ref> <res-ref-name>java:app/jdbc/TestDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <lookup-name>java:jboss/datasources/TestDS</lookup-name> </resource-ref> </application>
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="test"> <jta-data-source>java:app/jdbc/TestDS</jta-data-source> </persistence-unit> </persistence>
解決策
application.xml
よりpersistence.xml
が先に初期化されてるような気がするなぁ、とかモヤモヤしてたのですが、あっさり解決策が見つかりました。
単に検索しただけですが、、
どうやらpersistence.xml
にプロパティを1個追加すればOKなようです。
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="test"> <jta-data-source>java:app/jdbc/TestDS</jta-data-source> <properties> <property name="wildfly.jpa.twophasebootstrap" value="false" /> </properties> </persistence-unit> </persistence>
ということで動きました。
ポイントはwildfly.jpa.twophasebootstrap=false
にすることでした。
今回はjava:app
名前空間だけで試しましたが、java:module
やjava:comp
も同じ要領で動くと思います。
以上で終了です。