2015-10-15 205 views
0

每次我要求的EntityManager爲null,請參閱:的EntityManager返回總是空

@Named 
@ApplicationScoped 
@AnBasicDAO 
public class BasicDAOImpl implements BasicDAO, Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    @PersistenceContext(unitName="generalPU") 
    protected EntityManager entityManager; 

這是我的persistence.xml:

<persistence-unit name="generalPU" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider>  
     <non-jta-data-source>java:/comp/env/jdbc/testeDS</non-jta-data-source> 
     <properties> 
      <property name="hibernate.show_sql" value="false" /> 
      <property name="hibernate.format_sql" value="false" /> 
      <property name="hibernate.hbm2ddl.auto" value="update" /> 
      <property name="hibernate.cache.use_second_level_cache" 
       value="false" /> 
      <property name="hibernate.cache.use_query_cache" value="false" /> 
      <property name="hibernate.jdbc.batch_size" value="50" />    
     </properties> 
    </persistence-unit> 

這是我在server.xml中資源( Tomcat的):

<Context docBase="/home/usertest/Programas/apache-tomcat-7.0.59/webapps/cardoso" path="/cardoso" reloadable="false" source="org.eclipse.jst.jee.server:cardoso"> 
<Resource name="jdbc/testeDS" auth="Container" type="javax.sql.DataSource" 
      username="postgres" 
      password="pgadmin" 
      driverClassName="org.postgresql.Driver" 
      url="jdbc:postgresql://localhost:5432/teste" 
      maxTotal="25" 
      maxIdle="10" 
      validationQuery="select 1" /> 

</Context> 

我的context.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <ResourceLink global="jdbc/sabrecadoDS" name="jdbc/testeDS" type="javax.sql.DataSource"/> 
    <Manager pathname=""/> <!-- disables storage of sessions across restarts --> 
    <Resource name="BeanManager" 
     auth="Container" 
     type="javax.enterprise.inject.spi.BeanManager" 
     factory="org.jboss.weld.resources.ManagerObjectFactory"/> 
</Context> 

有什麼不對嗎? EntityManager始終爲空。一段時間以前,我用Spring(現在是CDI),並在applicationContext中定義了它並正常工作。

+0

你如何獲得對你的'BasicDAOImpl'的引用? –

+0

對不起,我沒有重視你的問題。 – RonaldoLanhellas

+0

CDI在tomcat中無法使用。您需要JavaEE應用程序服務器,例如TomEE或Glassfish。在tomcat中,你需要使用一個獨立的CDI容器,比如Weld。 – OndrejM

回答

1

CDI不理解@PersistenceContext。因此,將其更改爲:

@Inject 
protected EntityManager entityManager; 

但你必須定義EntityManager的地方,讓說:

import javax.enterprise.context.ApplicationScoped; 
import javax.enterprise.inject.Disposes; 
import javax.enterprise.inject.Produces; 
import javax.inject.Inject; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 

import org.apache.deltaspike.jpa.api.transaction.TransactionScoped; 

public class CdiApplicationConfig { 

    @Inject 
    private EntityManagerFactory emf; 

    @Produces 
    @ApplicationScoped 
    public EntityManagerFactory createEntityManagerFactory() { 
     EntityManagerFactory emf = Persistence.createEntityManagerFactory("generalPU"); 
     return emf; 
    } 

    public void close(@Disposes EntityManagerFactory emf) { 
     emf.close(); 
    } 

    @Produces 
    @TransactionScoped // is a bit better than @RequestScoped because it won't allow perform injection outside transaction context 
    public EntityManager createEntityManager() { 
     return emf.createEntityManager(); 
    } 

    public void close(@Disposes EntityManager em) { 
     if (em.isOpen()) { 
      em.close(); 
     } 
    } 
} 

上面的代碼使用DeltaSpike事務管理 - 但你可以使用任何你想要的吧。

一個提示:我不知道,如果斜線在裏面persistence.xml引用的數據源名稱java:/comp之間允許的,所以也請您查看:

<non-jta-data-source>java:comp/env/jdbc/testeDS</non-jta-data-source> 

正如你所看到的,CDI是非常相似的春天。

+0

CDI如何知道在注入ENtityManager屬性時應該調用createEntityManagerFactory()? – RonaldoLanhellas

+0

在EE-Server中,您仍然可以使用@PersistenceContext以及OpenWebBeans(和for)的資源模塊。 –

+0

爲什麼這只是在EE-Server中工作?什麼EE-Server更多使用? – RonaldoLanhellas