2014-11-24 30 views
1

我正在使用Jboss提供的JPA庫開始基於struts2的應用程序。 我已經在standalone.xml中配置了數據源,我可以從jboss管理控制檯看到數據源已經創建了 。並讀取並處理presistence.xml文件。 但是,如果我檢查Action Class中的EntityManager實例。它總是說空。JPA EntityManager未在struts2和JBOSS 7.1中初始化

這是我的persistence.xml和Action類片斷

<?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="primary"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:jboss/datasources/mysqlDS</jta-data-source> 

     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <properties> 
      <!-- Properties for Hibernate --> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.hbm2ddl.auto" value="update" /> 
      <property name="hibernate.use_sql_comments" value="true" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
     </properties> 

    </persistence-unit> 

</persistence> 

Struts2的Action類:

public class RegistrationAction extends ActionSupport implements SessionAware,Preparable ,ModelDriven{ 

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

    @PersistenceContext(unitName="primary") 
    private EntityManager em; 

    @Override 
    public Object getModel() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void prepare() throws Exception { 
     if(em==null) 
      System.out.println(" EM is null still.."); 
     //even Persistence.createEntityManagerFactory("primary"); returning NULL 

    } 

    @Override 
    public void setSession(Map<String, Object> arg0) { 
     // TODO Auto-generated method stub 

    } 

    public EntityManager getEm() { 
     return em; 
    } 

    public void setEm(EntityManager em) { 
     this.em = em; 
    } 

} 
+0

一對夫婦的建議,因爲我不知道確切的答案。你使用容器還是bean管理持久性?如果CMT,那麼你有沒有嘗試注入entityManagerFactory而不是entityManager? – Atul 2014-11-24 06:08:34

+0

我沒有使用EJB。它適用於Web組件嗎? – user1493834 2014-11-24 06:42:09

+0

是的,它的確如此。就像最初的建議一樣,嘗試注入entityManagerFactory而不是entityManager。你可以谷歌如何做到這一點。如果你得到不同的答案,首先嚐試他們的方法,因爲我不確定entityManagerFactory的增值。 – Atul 2014-11-24 07:37:38

回答

1

行動是由Struts的集裝箱管理。

EntityManager由管理CDI容器。您可以將其注入到CDI託管對象(EJB容器中的EJB,CDI託管的bean,servlet,ecc ...)中,但不在Actions中。您需要使用Struts2-CDI-Plugin或執行查找才能獲取它。你甚至不應該在動作中注入它,最好使用業務組件(用於檢查EJB)並執行查找。

如果不使用CDI插件(例如因爲使用Spring插件),Rob Veldpaus的CDIUtil.java是完美的。

EJB實例:

@Stateless 
public class MyEjb{ 

    @PersistenceContext(unitName="primary") 
    EntityManager em; 

    public Foo find(long id){ 
     return em.find(Foo.class, id); 
    } 
} 

示例操作:

public class RegistrationAction extends ActionSupport 
          implements SessionAware,Preparable ,ModelDriven { 

    public String execute(){ 
     MyEjb ejb = new CdiUtil().lookup(MyEjb.class); 
     System.out.println(ejb.find(1L)); 
     return SUCCESS; 
    } 

    /* your other stuff here */ 
} 
+0

偉大..但我有另一個問題。我試着使用em.persit()保存模型。它說:JBAS011469:要執行此操作(使用事務或擴展持久化上下文)需要事務..如果我嘗試調用em.getTransaction()說EntityManager不能使用交易..任何建議?我已經有@PersistenceContext(unitName =「primary」,type = PersistenceContextType.TRANSACTION)。 – user1493834 2014-11-24 14:55:45

+0

您需要在EJB中進行此操作(事務處理默認情況下爲Container託管),或者在CDI組件中(通過手動處理事務或使用@Interceptor),或者如果您想在視圖層中執行此操作(Actions),你需要使用[OSIV(開放會話視圖,Hibernate)/ OEMIV(開放實體管理器在視圖中,與JPA)* anti * -pattern](http://stackoverflow.com/a/26973725/1654265)。我強烈建議使用EJB 3.1方法。 – 2014-11-24 15:00:04

+0

我正在寫一個公司的求職門戶。我正在考慮切換到Tomcat7 -EclipseLink。我不覺得我需要EJB和Jboss提供的其他服務。你說什麼?對不起,這是關閉主題.. – user1493834 2014-11-24 15:08:12

1

CDI Plugin Struts 2的插件爲我工作。

的pom.xml中包括:

<!-- Import the CDI API --> 
    <dependency> 
     <groupId>org.apache.struts</groupId> 
     <artifactId>struts2-cdi-plugin</artifactId> 
     <version>${struts2.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.enterprise</groupId> 
     <artifactId>cdi-api</artifactId> 
     <version>1.0-SP1</version><!--$NO-MVN-MAN-VER$--> 
     <scope>provided</scope> 
    </dependency> 

然後在我的Action類:

public class SampleAction extends BaseAction{ 

private static final long serialVersionUID = 1L; 

@PersistenceUnit 
private EntityManagerFactory emf; 

@Action(value="add") 
public String add(){ 
    try{ 
     EntityManager em = emf.createEntityManager(); 
     em.getTransaction().begin(); 
     ........ 
     em.merge(...); 
     em.getTransaction().commit(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    return SUCCESS; 
} 
}