2011-09-10 35 views
1

是否可以使用EclipseLink 2.3在EntityManager中進行注入?JPA如何注入?

這是我的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="SuaParte" transaction-type="RESOURCE_LOCAL"> 
       // classes.. 
     <properties> 
      <property name="eclipselink.jdbc.batch-writing" value="JDBC"/> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/schema"/> 
      <property name="javax.persistence.jdbc.user" value="root"/> 
      <property name="javax.persistence.jdbc.password" value="root"/> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

我是新與JPA,所以我創建了第一本persistence.xml文件只是爲了測試,看看它是否正常工作,但現在我想使用@PersistenceContext不必擔心管理EntityMangerFactoryEntityManager

我正在使用帶有GlassFish v3的Eclipse Indigo Java EE Web開發人員。

UPDATE: 我跟隨@Andrei Bodnarescu方法,這個方法也tutorial,一切都很好打通GF3與我的數據庫的連接:

Ping database

而且我改變我的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="SuaParte" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>jdbc/mysql</jta-data-source> 
       //classes.. 
    </persistence-unit> 
</persistence> 

所以我儘量在我的數據庫堅持的東西:

@Stateless 
@LocalBean 
public class DaoUser { 
    @PersistenceContext(unitName="SuaParte") 
    private EntityManager em; 

    public void persist(User user){ 
     try{ 
      em.persist(user); 
      }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

而且它在em.persist(user);中返回java.lang.NullPointerException。 我在做什麼錯?

+0

什麼是t他在使用'@ PersistenceContext'時遇到問題?你的問題並不完全清楚。如果您將事務類型更改爲「JTA」,它應該在Glassfish中工作得很好。 – BalusC

+0

@BalusC,我沒有在GlassFish中創建連接池,我不知道我必須這樣做。 我已經做了什麼安德烈告訴,但現在返回java.lang.NullPointerException。 –

+0

這很可能是因爲缺少CDI工作所需的一些依賴關係。沒有更多細節很難說。如果您不想在glassfish中使用JPA2 + EJB3 + CDI的工作示例,請查看我在http://myprojects2.googlecode.com/svn/trunk/other_projects/jpa2Exam/ –

回答

1

你必須在交易類型更改爲JTA如下 -

<persistence-unit name="SuaParte" transaction-type="JTA"> 

然後你就可以使用@PersistenceContext如下,如果你想GlassfishinjectEntityManager到您的EJB -

@Stateless 
@LocalBean 
public class MyEjb { 

    @PersistenceContext("SuaParte") 
    private EntityManager suaParteEM; 

} 

您也可以在ServletManagedBean

此外,您Glassfish服務器上,你可以創建JDBC Connection PoolJDBC Resource,給它一個JNDI name,並用它來聲明EntityManagerpersistence.xml如下 -

<persistence-unit name="SuaParte" transaction-type="JTA"> 
    <jta-data-source>JNDI_Name_Of_JDBC_Resource</jta-data-source> 

您可以從Glassfish Admin-Console上創建JDBC Resources

+0

上的小項目,是否可以幫我解決我的問題? 我照你和Andrei Bodnarescu的說法做了,但仍然給出了java.lang.NullPointerException異常,我真的不知道爲什麼會發生這種情況,我花了2天時間並沒有到目前爲止,請你幫助我嗎? –

1

BheshG的回答非常好,這裏只是一些小的附錄。

  • 我認爲,爲了激活CDI並因此有依賴注入,你需要創建一個空的bean。你必須在你的項目的WEB-INF文件夾放置

  • 要在GF3創建數據源,並通過像BheshG賽斯JNDI揭露它,你必須XML文件基本上是這樣的:

    1. 資源 - > JDBC-> JDBC連接池並建立連接池

    2. 創建將使用該池的數據源。

(我想與conenction池和數據源的例子,發佈圖片,但我不能,因爲我沒有信譽分。爲了似乎沒有垃圾和推車,我只是會說:給我發電子郵件,如果你想了解更多的細節或示例項目,我現在正在準備一個教程)

現在,您可以在persistence.xml文件中使用該數據源將其附加到持久性單元:

<persistence-unit name="emJTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>jdbc/postgre_ds_jta</jta-data-source> 
    <mapping-file>META-INF/emp-mappings.xml</mapping-file> 
    <class>model.Employee</class> 
    <class>model.ProjectManager</class> 
    <class>model.Department</class> 
    <class>model.Project</class> 
    <class>model.Phone</class> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> 
     <property name="hibernate.hbm2ddl.auto" value="update" /> 
    </properties>  
</persistence-unit> 
+0

我更新了我的帖子,請你看看我的新情況嗎? 謝謝兄弟。 –

+0

安德烈,請老兄,幫幫我,我不知道你的電子郵件,沒有在你的個人資料中找到,我真的需要一些幫助在這裏.. –