代码之家  ›  专栏  ›  技术社区  ›  Pradyut Bhattacharya

使用JPA更新

  •  1
  • Pradyut Bhattacharya  · 技术社区  · 14 年前

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

    任何帮助

    谢谢

    普拉杜特

    3 回复  |  直到 12 年前
        1
  •  1
  •   Pradyut Bhattacharya    14 年前

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

    谢谢

    普拉杜特

        2
  •  0
  •   Bozho    14 年前
    1. 也许您的bean没有被管理——也就是说,它不是任何上下文(Spring、EJB)的一部分。如何创建对象?
    2. 你真的不应该打电话 createEntityManager() -使用注入一个 @PersistenceContext
    3. 在使用之前,您必须绝对确定您需要JTA。
    4. 你好像在用 PersistenceUnit ,然后重新分配 etm -我建议两个都放下看看上面的p2。

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

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

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

        3
  •  0
  •   Bill the Lizard Hacknightly    12 年前

    你的“正常”课很可能不是 托管组件 即生命周期由容器管理的类(如servlets、servlet过滤器、jsp标记处理程序、jsf托管bean等),不能从资源注入中获益。 . 所以两者都不 UserTransaction 也不 EntityManagerFactory 在这里注射,因此 NullPointerException .

    老实说,您应该尝试使用托管的容器 EntityManager ,这样可以减少代码的混乱。如果无法注入,请通过JNDI查找获取。请参阅下面的资源。

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

    资源

    工具书类

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