2016-02-21 28 views
0

我想使用JTA數據源實例化一個EntityManager,但我總是得到NullPointerException。 這裏是我的環境: 服務器:JBossAS 7.0 JPA:2.0 DB:MySQL的無法使用JTA數據源創建EntityManager

的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>

持久性是間 - 下INF,它是動態的web項目,並且運行良好。使用實體管理器的分類不是一個EJB。

任何提示?

回答

0

讓我提醒你注意以下時刻:

我沒有在你的代碼driver看到MySQL來你從datasource參考:

<driver> 
    mysql 
</driver> 

你做肥大如下:

輸入文件路徑$ {jboss_home}/modules並創建目錄com/mysql/jdbc/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> 

而到了<drivers>標籤在standalone.xml地址:

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

2.可能是你應該把你的個人istence.xml您的Web模塊中:

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

你可以做注射EntiryManeger只進EJB或類@Transactional註解。檢查確認你的DAO類是EJB bean。

+0

1 - 謝謝你的回答。我編輯了我的問題,以便找到驅動程序定義部分和更多信息。 我應該用來代替嗎?我使用的是5.1.18版本的mysql,我的方法和你所做的一樣(除了我使用的路徑) 2 - 是的持久性在META-INF文件夾下。 3 - 它不是一個EJB嗎?我怎樣才能使用PersistenceUnit呢? –

+0

by 3 look http://stackoverflow.com/questions/4708035/persistencecontext-entitymanager-injection-nullpointerexception – HAYMbl4