2013-02-11 28 views
0

我是JPA的begginer,當我在servlet中使用@PersistenceUnit時遇到問題。 EntityManagerFactory沒有被注入,我不知道爲什麼。EntityManagerFactory未被注入 - JPA

public class MyServlet extends HttpServlet 
{ 

    @PersistenceUnit 
    private EntityManagerFactory emf = null; 

    public MyServlet() 
    { 
    super();   
    } 

    @Override 
    public void init(ServletConfig config) throws ServletException 
    { 
    super.init(config); 
    } 


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    Writer w = response.getWriter(); 
    w.append("HELLO HELLO"); 
    w.close(); 
    } 

} 

我已經配置persistence.xml文件(META-INF目錄中)這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.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_1_0.xsd"> 
<persistence-unit name="MiddlewareExpedElectrModel" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider>  
    <non-jta-data-source>java:/OracleDS</non-jta-data-source> 
    <class>com.ieci.mugeju.middleware.model.entities.FechaUltimaSolicitudProcesada</class> 
    <properties>   
    <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/> 
    <property name="hibernate.show_sql" value="true"/> 
    <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>   
    </properties>  
</persistence-unit> 

爲什麼不EntityManagerFactory的注入?

我正在使用Jboss 4.2.3,並且我還使用oracle-ds.xml文件配置了一個數據源。

UPDATE:

如果我試圖以編程方式獲得的EntityManagerFactory,效果很好:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("MiddlewareExpedElectrModel"); 

但我想通過注射獲得EntityManagerFactory實例。 謝謝!

+0

任何人都可以幫助我嗎? :( – Eduardo 2013-02-13 09:30:11

+0

您是否嘗試過使用'@PersistenceContext(unitName =「MiddlewareExpedElectrModel」,name =「persistence/em」)''public class MyServlet extends HttpServlet {'? – 2013-02-14 12:22:03

+0

不,我沒有嘗試過,但我認爲我讀過@PersistenceContext一定不能用在HttpServlet中 – Eduardo 2013-02-15 10:13:26

回答

0

你可以嘗試

public class MyServlet extends HttpServlet { 
//this is thread-safe 
@PersistenceUnit(unitName="MiddlewareExpedElectrModel") 
private EntityManagerFactory emf; 

據我所知,在EntityManager接口方法不是線程安全的,並且可能不多個併發請求之間共享。因此,不要將EntityManager注入到servlet實例變量中。

這不是線程安全的,並且避免

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

您仍然可以在servlet類類型級別注入的EntityManager,並請求處理過程中需要時查找。

@PersistenceContext(unitName="MiddlewareExpedElectrModel", name="persistence/em") 
public class MyServlet extends HttpServlet { 
protected void doGet(
HttpServletRequest request, 
HttpServletResponse response) 
throws ServletException, IOException { 
try { 
    InitialContext ic = new InitialContext(); 
    EntityManager em = 
    (EntityManager) ic.lookup("java:comp/env/persistence/em"); 
    } catch (NamingException ex) { 
    ... 
    } 
+0

感謝您的回覆!我按照您告訴過的,使用'unitName'屬性嘗試過它,但它不能再次工作。emf實例始終爲空,沒有被注入,我不知道我在做什麼錯誤。 – Eduardo 2013-02-12 07:36:44

+0

你嘗試過沒有'null'嗎?私人EntityManagerFactory emf;' – 2013-02-12 11:06:25

+1

我剛剛試過沒有null,它不起作用。 – Eduardo 2013-02-12 11:57:37

相關問題