1

私は JPA の初心者ですが、サーブレットで @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 が注入されないのはなぜですか?

私は Jboss 4.2.3 を使用しています。また、oracle-ds.xml ファイルを使用してデータソースを構成しました。

アップデート:

プログラムで EntityManagerFactory を取得しようとすると、うまく機能します。

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

しかし、インジェクションを介して EntityManagerFactory インスタンスを取得したいと思います。ありがとう!

4

2 に答える 2

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) {
    ...
  }
于 2013-02-11T19:02:25.597 に答える