1

私はGlassfishv2と永続性をWebアプリケーションで使用しています。

Webアプリケーション内の通常のJavaクラスファイルを使用して永続コードを呼び出しています

このコードを使用して簡単に選択できます:-

   @PersistenceUnit
public EntityManagerFactory emf;
EntityManager em;


public List fname (String id) {
    String fname = null;
    List persons = null;
    //private PersistenceManagerFactory persistenceManagerFactory;

    try {
        emf = Persistence.createEntityManagerFactory("WebApplicationSecurityPU");

        em = emf.createEntityManager();
        persons = em.createQuery("select r from Roleuser r").getResultList();

        int i=0;
        for (i=0;i<persons.size(); i++)
            System.out.println("Testing n "+ i +" " + persons.get(i));

    } catch(Exception e) {
        System.out.println("" + e);
    }
    finally {
        if(em != null) {
            em.close();
        }
    }
    return persons;
}

persistence.xmlファイルにtransaction-type="JTA"があるため、JTAを使用して更新したい

このコードを使用して更新を使用しようとすると、ログにトレースがないnullPointerExceptionが発生します

     @PersistenceUnit
public EntityManagerFactory emf;
EntityManager em;
Context context;
@Resource
private UserTransaction utx;

public List fname (String id) {

    String fname = null;
    List persons = null;


    try {
        emf = Persistence.createEntityManagerFactory("WebApplicationSecurityPU");

        utx.begin();
        em = emf.createEntityManager();

        int m = em.createQuery("update Roleuser r set r.firstName = 'Jignesh I' where r.userID=9").executeUpdate();

        utx.commit();


    } catch(Exception e) {
        System.out.println("" + e);
    }
    finally {
        if(em != null) {
            em.close();
        }
    }
    return persons;
}

ヘルプ

ありがとう

プラデュット

4

3 に答える 3

1

さて、コードには悪夢がないはずです...(少なくとも私にとってはglassfishで)
persistence.xmlには

<persistence-unit name="WebApplicationSecurityPU" transaction-type="RESOURCE_LOCAL">

コード

@PersistenceUnit
public EntityManagerFactory emf;
public EntityManager em;




public EntityManager getEm() {
    emf = Persistence.createEntityManagerFactory("WebApplicationSecurityPU");
    em = emf.createEntityManager();
    return em;
}

public List fname (String id) {

    String fname = null;
    List persons = null;


    try {
        System.out.println("test");

        em = this.getEm();


        em.getTransaction().begin();
        int m = em.createQuery("update Roleuser r set r.firstName = 'Jignesh H' where r.userID=9").executeUpdate();

        em.getTransaction().commit();


    } catch(Exception e) {
        System.out.println("" + e);
    }
    finally {
        if(em != null) {
            em.close();
        }
    }
    return persons;
}

どんな改善も歓迎します...(実際に必要です...)(@ PersistenceContextの使用方法)

ありがとう

プラデュット

于 2010-02-14T23:14:09.520 に答える
0
  1. おそらく、Beanは管理されていません。つまり、コンテキスト(Spring、EJB)の一部ではありません。オブジェクトをどのように作成していますか?
  2. あなたは本当に呼び出すべきではありませんcreateEntityManager()-を使用して1つを注入します@PersistenceContext
  3. JTAを使用する前に、JTAが必要であることを絶対に確認する必要があります。
  4. を使用しているようですPersistenceUnitが、再割り当てしますetm-両方を削除して上記のp2を参照することをお勧めします。

依存性注入をまったく使用していない場合は、すべてのアノテーションを削除し、現在のコードを保持して、次のように入力します。

em.getTransaction().begin();
...
em.getTransaction().commit();

(そしてpersistence.xmlで定義RESOURCE_LOCALします。本当にJTAは必要ありません)

于 2010-02-14T21:29:07.080 に答える
0

「通常の」クラスは、マネージコンポーネントではない可能性が非常に高く、ライフサイクルがコンテナ(サーブレット、サーブレットフィルタ、JSPタグハンドラ、JSFマネージドBeanなど)によって管理され、リソースインジェクションの恩恵を受けることができないクラスです。1。したがって、ここでは、も注入もされません。したがってUserTransaction、。EntityManagerFactoryNullPointerException

正直なところ、管理されたコンテナを使用するEntityManagerようにしてください。これにより、コードが煩雑になりません。挿入できない場合は、JNDIルックアップを介して取得してください。以下のリソースを参照してください。

1 Java EE 5で使用するWeb層を見てください:何をどこに注入できるかについての概要については、リソース注入を見てください。

資力

参考文献

  • JPA1.0仕様
    • セクション5.2「エンティティマネージャの取得」
    • セクション5.6「コンテナ管理による永続性コンテキスト」
于 2010-02-15T01:24:03.283 に答える