无法使用JTA数据源创建EntityManager

时间:2016-02-21 20:39:41

标签: jpa jboss7.x

我正在尝试使用JTA数据源实例化一个EntityManager,但我总是得到NullPointerException。 这是我的环境: 服务器:JBossAS 7.0 JPA:2.0 DB:MySQL

的persistence.xml

    <?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
    <persistence-unit name="WebStock" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>stockmanagementDS</jta-data-source>
        <class>prv.stockmanagement.business.Product</class>
    </persistence-unit>
</persistence>

在dao课上我正在尝试这个:

@PersistenceContext(type=PersistenceContextType.EXTENDED, unitName="WebStock")
private EntityManager em;

但是当我使用它的getter时,我在这里得到NullPointerException:

public EntityManager getEntityManager() {
        return em;
    }

调试显示它为空。

这是standalone.xml中的数据源定义:

<datasource jndi-name="stockmanagementDS" pool-name="stockmanagement" enabled="true" jta="true" use-java-context="true" use-ccm="true">
                    <connection-url>
                        jdbc:mysql://localhost:3306/kitchen_stock
                    </connection-url>
                    <driver>
                        mysql
                    </driver>
                    <security>
                        <user-name>
                            root
                        </user-name>
                        <password>
                            rootroot
                        </password>
                    </security>
                    <statement>
                        <prepared-statement-cache-size>
                            100
                        </prepared-statement-cache-size>
                        <share-prepared-statements/>
                    </statement>
                </datasource>

“mysql”是我在数据源之后定义的驱动程序的名称:

<drivers> <driver name="mysql" module="com.sql.mysql"> <driver-class> com.mysql.jdbc.Driver </driver-class> </driver> <driver name="h2" module="com.h2database.h2"> <xa-datasource-class> org.h2.jdbcx.JdbcDataSource </xa-datasource-class> </driver> </drivers>

持久性属于META-INF,它是动态的Web项目,并且运行良好。使用实体管理器的分类不是EJB。

任何提示?

1 个答案:

答案 0 :(得分:0)

让我提请你注意以下几点:

1。我在您的代码driver中没有看到您从datasource引用的MySql:

<driver>
   mysql
</driver>

你桅杆确实遵循:

输入文件路径 $ {jboss_home} / modules 并创建目录 com / mysql / jdbc / main 。进入文件夹 main 复制驱动程序库jar(例如 mysql-connector-java-5.1.38-bin.jar )并创建文件 module.xml

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.mysql.jdbc">
  <resources>
     <resource-root path="mysql-connector-java-5.1.38-bin.jar"/>              
  </resources>
  <dependencies>
     <module name="javax.api"/>
  </dependencies>
</module>

standalone.xml 中的<drivers>标记添加:

<driver name="mysql" module="com.mysql.jdbc">
  <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
</driver>

2。您可以将 persistence.xml 放入网络模块中:

web
  src
    main
      java
        ..
      resources
        META-INF
          persistence.xml
      webapp
        ..

3。您只能将EntiryManeger注入EJB或带有@Transactional注释的课程。检查以确保您的DAO类是EJB bean。