Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Servlets 未注入EntityManagerFactory-JPA_Servlets_Jpa - Fatal编程技术网

Servlets 未注入EntityManagerFactory-JPA

Servlets 未注入EntityManagerFactory-JPA,servlets,jpa,Servlets,Jpa,我是JPA的乞丐,在servlet中使用@PersistenceUnit时遇到了问题。EntityManagerFactory没有被注射,我不知道为什么 public class MyServlet extends HttpServlet { @PersistenceUnit private EntityManagerFactory emf = null; public MyServlet () { super(); } @Overr

我是JPA的乞丐,在servlet中使用@PersistenceUnit时遇到了问题。EntityManagerFactory没有被注射,我不知道为什么

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实例。 谢谢

你能试试吗

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) {
    ...
  }

我在glassfish服务器上的应用程序中也遇到了同样的问题。 在我从web.xml中删除servlet声明并使用注释声明servlet之前,entitymanager工厂始终为空

@WebServlet("/GetRevisioniServlet")  // <-- this annotation solved all my problems
public class GetRevisioniServlet extends HttpServlet {

@PersistenceUnit(unitName = "clerpPU")
private EntityManagerFactory entityManagerFactory;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

        EntityManager em = null;
        em = entityManagerFactory.createEntityManager(); 
        .....
    }
 }

@WebServlet(“/GetRevisioniServlet”)//谢谢您的回复!正如你告诉我的那样,我尝试过使用“unitName”属性,但它不再起作用。emf实例始终为空,未被注入。我不知道我做错了什么。你试过没有
null
<代码>私有实体管理器工厂emf@PersistenceContext(unitName=“middlewareexpedelectromodel”,name=“persistence/em”)
公共类MyServlet扩展了HttpServlet{?不,我没有试过。但是我想我读到过@PersistenceContext不能在HttpServlet中使用。PersistenceContext不应该在servlet中使用,因为它不是线程安全的,而且servlet不是线程安全的,您可能会遇到问题(相比之下,您可以在EJB中注入PersistenceContext,因为EJB实例调用是序列化的)。
@WebServlet("/GetRevisioniServlet")  // <-- this annotation solved all my problems
public class GetRevisioniServlet extends HttpServlet {

@PersistenceUnit(unitName = "clerpPU")
private EntityManagerFactory entityManagerFactory;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

        EntityManager em = null;
        em = entityManagerFactory.createEntityManager(); 
        .....
    }
 }