1

我在 Web 应用程序中使用 glassfish v2 和持久性。

我正在使用 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;
}

我想使用 JTA 进行更新,因为 persistence.xml 文件具有 transaction-type="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()- 注入一个使用@PersistenceContext
  3. 在使用它之前,您必须绝对确定您需要 JTA。
  4. 您似乎正在使用PersistenceUnit,但随后重新分配etm- 我建议放弃两者并参见上面的 p2。

如果您根本不使用任何依赖注入,则删除所有注释,保留当前代码,然后键入:

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

(并RESOURCE_LOCAL在你的persistence.xml中定义。你真的不需要JTA)

于 2010-02-14T21:29:07.080 回答
0

您的“正常”类很可能不是托管组件,即生命周期由容器管理的类(如 Servlet、Servlet 过滤器、JSP 标记处理程序、JSF 托管 Bean,...)并且不能从资源注入中受益1 . 所以 和 都UserTransaction没有在EntityManagerFactory这里注入,因此NullPointerException.

老实说,您应该尝试使用容器管理EntityManager,这将使您的代码不那么混乱。如果您无法注入它,请通过 JNDI 查找来获取它。请参阅下面的资源。

1查看Web Tier to Go With Java EE 5: A Look at Resource Injection,了解可以注入的内容和位置。

资源

参考

  • JPA 1.0 规范
    • 第 5.2 节“获取实体管理器”
    • 第 5.6 节“容器管理的持久性上下文”
于 2010-02-15T01:24:03.283 回答