使用JPA更新

时间:2010-02-14 21:18:51

标签: java orm jpa jta

我在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文件进行更新 交易类型= “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;
}

任何帮助

由于

Pradyut

3 个答案:

答案 0 :(得分:1)

好吧,代码应该没有任何噩梦...(至少对我来说是玻璃鱼)
使用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)

由于

Pradyut

答案 1 :(得分:0)

  1. 也许你的bean没有被管理 - 也就是说它不是任何上下文的一部分(spring,EJB)。你是如何创建对象的?
  2. 你真的不应该致电createEntityManager() - 使用@PersistenceContext
  3. 注入一个
  4. 在使用之前,您必须绝对确定需要JTA。
  5. 您似乎正在使用PersistenceUnit,但随后重新分配etm - 我建议删除两者并查看上面的p2。
  6. 如果您根本没有使用任何依赖注入,请删除所有注释,保留当前代码并键入:

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

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

答案 2 :(得分:0)

您的“普通”类很可能不是托管组件,即生命周期由容器管理的类(如Servlet,Servlet过滤器,JSP标记处理程序,JSF托管Bean,... 。)并且不能从资源注入 1 中受益。 因此UserTransactionEntityManagerFactory都不会在这里注入,因此NullPointerException

老实说,您应该尝试使用托管EntityManager的容器,这会使您的代码变得更加混乱。如果您无法注入,请通过JNDI查找获取它。请参阅下面的资源。

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

资源

参考

  • JPA 1.0规范
    • 第5.2节“获取实体经理”
    • 第5.6节“容器管理的持久性上下文”