2012-02-11 10 views
2

JPAを使用して小さなプロジェクトを行っています。私は従業員オブジェクトを挿入する必要があります。 注釈付きエンティティマネージャを使用すると、NullPointer例外が発生します。 しかし、注釈を使用せずに通常のEntityManagerを使用するとうまくいきます。 この罰金を働かせるためにpersistence.xml以外のどこかを設定する必要がありますか?アノテートされたエンティティマネージャヌル先取り例外

下記のコードをご覧ください。

public class EmployeeDao implements IEmployeeDao{  

    @PersistenceContext(unitName = "timesheet") 
    private EntityManager entityManager ; 

    @Override 
    public boolean createEmployee(IEmployee employee) { 

     this.entityManager.persist(employee);  

     return true; 
    } 
} 

persistence.xmlの

<?xml version="1.0" encoding="UTF-8" ?> 
<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" 
    version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> 
    <persistence-unit name="timesheet" transaction-type="RESOURCE_LOCAL">  
     <class>com.timesheet.model.Employee</class>  
     <properties> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
      <property name="javax.persistence.jdbc.url" 
       value="jdbc:mysql://localhost:3306/timesheet" /> 
      <property name="javax.persistence.jdbc.user" value="root" /> 
      <property name="javax.persistence.jdbc.password" value="" /> 

      <!-- EclipseLink should create the database schema automatically --> 
      <property name="eclipselink.ddl-generation" value="create-tables" /> 
      <property name="eclipselink.ddl-generation.output-mode" 
       value="database" /> 
     </properties> 

    </persistence-unit> 
</persistence> 
+0

クラッシュが発生するコードとエラーの完全なスタックトレースを追加できますか? –

+0

@Traroth entityManagerが挿入されておらず、nullであるため、this.entityManager.persist(employee)で発生します。 –

答えて

3

リソースの注入(@PersistenceContext)は、コンテナ管理クラス(EJBやサーブレットなど)でのみ機能します。これについては、Java EE仕様v6、EE5.2.5などで詳しく説明しました。あなたは何ができるか

  • は、それがマネージクラスにリソースのクラス
  • 移動注入を管理されているように、あなたのクラスを変更し、
  • 以前のように に
  • 使用JNDIルックアップをEmployeeDao、
  • を渡し
+0

このプロジェクトでは、私はejbまたはサーブレットを使用していません。私は直接サービスにアクセスします。その場合、この作業を行うために春を設定できますか? – user414967

+0

はい、ここでは、http://stackoverflow.com/questions/2421339/how-to-inject-jpa-entitymanager-using-springは、JpaDaoSupportを拡張しない方法について説明しています。私はおそらくJNDIルックアップのために行くでしょう、もしSpringがプロジェクトで使われていなければ。しかしそれは単に意見の問題です。 –

1

があなたのEmployeeDaoIEmployeeDaoクラスのための注釈javax.ejb.Statelessを使用してください。 Entitymanagerは、エンタープライズJava Beanがクライアントにインジェクトされていないインタフェースです。

クライアントは、Webコンポーネントまたは別のエンタープライズBeanのいずれかである必要があります。 EJBの使用方法の詳細については、hereを参照してください。

つまり、Statelessアノテーションを使用すると、WebコンテナはEmployeeDaoクラスのライフサイクルを処理します。

0

RESOURCE_LOCALの代わりにJTAのトランザクションタイプを使用します。プログラムがアプリケーションサーバーで実行され、トランザクションタイプがJTAの場合にのみ、EntityManagerインスタンスを取得できます。だから、すべての答え上記

0

はそれを要約するために導く:

  • 注釈を介したリソースインジェクションは、コンテナ管理のクラス(例えばEJB、サーブレット)上で動作します。
  • リソースの注入は、単純なJPAプロジェクト(コンテナ管理クラスを持たないプロジェクト)の注釈(@PersistenceContextなど)を除いて行うことができます。次のコードスニペットあなたに明快なビューを与える:知識を共有するためのすべての

    private EntityManagerFactory factory; 
        factory = Persistence.createEntityManagerFactory("PERSISTENCE_UNIT_NAME"); 
        EntityManager em = factory.createEntityManager(); 
    

感謝を。

関連する問題