【问题标题】:update using JPA使用 JPA 更新
【发布时间】:2012-08-02 00:16:23
【问题描述】:

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

任何帮助

谢谢

普拉迪特

【问题讨论】:

  • 您尝试在哪个类中注入UserTransaction?另外,请添加完整的堆栈跟踪...
  • 我没有初始化 utx !!!....我正在寻找但找不到任何代码....任何帮助
  • 我得到的只是一个 nullPointerException,日志中没有任何痕迹

标签: java orm jpa jta


【解决方案1】:

代码应该没有任何噩梦......(至少对我来说是 glassfish)
具有持久性.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】:
    1. 也许您的 bean 不是托管的 - 即它不是任何上下文(spring、EJB)的一部分。您是如何创建对象的?
    2. 你真的不应该打电话给createEntityManager() - 使用@PersistenceContext注入一个
    3. 在使用之前,您必须绝对确定您需要 JTA。
    4. 您似乎在使用 PersistenceUnit,但随后重新分配 etm - 我建议您放弃两者并参见上面的 p2。

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

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

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

    【讨论】:

    • 那么做了...我只想指出,如果没有注释 @PersistenceUnit 它会给出 oracle.toplink.essentials.exceptions.DatabaseException 反正我只是想知道什么是关系带有 EJB(或 spring)的 JTA 以及为什么不能与普通类文件一起使用...任何参考谢谢
    • 有一些方法,但你不需要它们。而且它们太复杂了。暂时坚持这个。你总是可以用谷歌搜索 JTA 并阅读,但你必须阅读很多;)
    • omg !!!... 我无法真正得到 wats 发生但没有这些代码将无法运行 @PersistenceUnit public EntityManagerFactory emf;实体管理器 em; @资源
    • 它可能无法编译。我说只删除注释,而不是变量本身。
    • 哈哈...显然不是变量,而是需要注释@PersistenceUnit 和@Resource....没有@Resource 它会给出错误...内部异常:java.sql.SQLException: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified Error Code: 0 now where does odbc and microsoft come in.. 我正在使用 mySQL...omG!!!
    【解决方案3】:

    您的“普通”类很可能不是托管组件,即生命周期由容器管理的类(如 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 节“容器管理的持久性上下文”

    【讨论】:

      猜你喜欢
      • 2011-05-03
      • 2012-07-01
      • 1970-01-01
      • 2013-02-12
      • 2011-03-19
      • 2017-11-20
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多