2013-02-11 8 views
0

Я начинаю с JPA, и у меня возникают проблемы, когда я использую @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

+0

Вы пытались использовать '@PersistenceContext (unitName =" MiddlewareExpedElectrModel ", name =" persistence/em ")' above 'public class MyServlet extends HttpServlet {'? –

+0

Нет, я не пробовал. Но я думаю, что Я прочитал, что @PersistenceContext не должен использоваться в HttpServlet. – Eduardo

ответ

0

Вы можете попробовать

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

Насколько я знаю, методы в интерфейсе EntityManager не являются поточно-безопасными и не могут быть разделены между несколькими одновременных запросов. Поэтому не вводите EntityManager в переменную экземпляра сервлета.

это не поточно-и избежать его

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

Вы все еще можете придать 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 всегда имеет значение null , не вводится. Я не знаю, что я делаю неправильно. – Eduardo

+0

Вы пробовали без 'null'?' private EntityManagerFactory emf; ' –

+1

Я только что пробовал без null и не работает. – Eduardo

Смежные вопросы