jta-data-source を使えば上手く行く

http://www.sssg.org/blogs/hiro345/archives/10663.html
ここを参考に JBoss AS7 に MySQLJDBC ドライバを追加する。んで、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