jta-data-source を使えば上手く行く
http://www.sssg.org/blogs/hiro345/archives/10663.html
ここを参考に JBoss AS7 に MySQL の JDBC ドライバを追加する。んで、standalone.xml をちょちょいと書き変える。
<datasources> <!-- 略 --> <datasource jndi-name="java:/mysql/menudb" pool-name="MySQL" enabled="true" use-java-context="true" jta="true"> <connection-url>jdbc:mysql://localhost:3306/menudb</connection-url> <driver>mysql</driver> <security> <user-name>scott</user-name> <password>tiger</password> </security> </datasource> <drivers> <driver name="mysql" module="com.mysql" /> <driver name="h2" module="com.h2database.h2"> <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class> </driver> </drivers> </datasources>
接続環境を合わせるためにここの部分は載せておきます。module.xml とかは上記のサイトを見てください。んで、persistence.xml を書き変える。
<?xml version="1.0" encoding="utf-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="customerManager"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>java:/mysql/menudb</jta-data-source> <class>jp.mydns.akanekodou.entity.Customer</class> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> </properties> </persistence-unit> </persistence>
properties の javax.persistence.jdbc 関連を削除して代わりに jta-data-source を使う。これで動いた。hibernate.cfg.xml はなくていい。EAR プロジェクトに JDBC ドライバはいらない。
できればこれは最後の手段にしたかったんだが…。
2013/04/22 追記 : 未練がましくいろいろ調べてみたが、PersistenceContext による依存性注入で EntityManager を持ってくるにはどうやらこの方法しかなさそうだ。もうあきらめる(´・ω・`)
2013/04/22 追記 2 : CustomerDAOBean をこう書き変えれば一応は動くと思う。
package jp.mydns.akanekodou.dao; import javax.ejb.Stateless; import javax.persistence.Persistence; import javax.persistence.EntityManager; import javax.persistence.Query; import java.util.List; import jp.mydns.akanekodou.entity.Customer; @Stateless public class CustomerDAOBean implements CustomerDAO { private EntityManager manager = Persistence.createEntityManagerFactory("customerManager").createEntityManager(); public List<Customer> all() { Query query = manager.createQuery("from jp.mydns.akanekodou.entity.Customer"); @SuppressWarnings("unchecked") List<Customer> list = query.getResultList(); return list; } }
EJB の意味がないやん(´・ω・`)
嘘です動きませんでした orz