【问题标题】:How update the database using a web service and EclipseLink as JPA provider?如何使用 Web 服务和 EclipseLink 作为 JPA 提供程序更新数据库?
【发布时间】:2012-03-11 17:30:21
【问题描述】:

我使用 EclipseLink 作为 JPA 提供者完成了一个简单的 Web 服务。我是 JPA 的初学者,所以我想知道这是否是更新数据库的常用方式和最纯粹和安全的方式:

EntityManager em = emf.createEntityManager();
   if(!em.getTransaction().isActive()){
       em.getTransaction().begin();
   }
   Query query = (Query)em.createNamedQuery("Person.updatePerson");
   query.setParameter("personId", person.getPersonPK().getPersonId())
        .setParameter("personName", name);
   return query.executeUpdate();

为什么我在调用em.getTransaction().begin() 后不需要使用em.getTransaction().commit();query.executeUpdate() 似乎更新了数据库,而不是提交调用。为什么呢?有什么推荐的?

【问题讨论】:

    标签: java database web-services jpa eclipselink


    【解决方案1】:

    有趣的问题,我用非 jta 数据源做了一些调查:

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("unit1");
    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    // database: t.name='OLD'
    Query query = em.createQuery("UPDATE Test t set t.name = 'NEW'");
    query.executeUpdate();
    // database: t.name='OLD'
    TypedQuery<String> tq 
        = em.createQuery("SELECT t.name from Test t", String.class);
    System.out.println(tq.getSingleResult()); 
    // output: 'NEW'
    // database: t.name='OLD'
    em.getTransaction().commit();
    // database: t.name='NEW'
    

    我的解释方法(如有错误请指正):

    1. 数据库在em.getTransaction().commit() 之前保持“OLD”值。
    2. SELECT 查询从持久性上下文返回“新”

    【讨论】:

    • 这是詹姆斯在之前的回答中所说的。您的更改是在当前事务的范围内完成的,并且仅在事务提交之前在其中可见。 EntityManager 正在使用相同的连接/事务,因此可以看到更改 - 其他 EM 和连接在事务提交之前无法看到。
    【解决方案2】:

    您需要调用 commit() 来提交事务。执行查询不会提交。

    您使用什么类型的交易? JTA 还是 RESOURCE_LOCAL?如果您使用的是 JTA,那么您必须使用 JTA 来开始提交事务。

    启用日志记录以获取更多详细信息。

    一般而言,JPA 更新通常通过读取对象并使用其设置方法来完成,而不是执行原始查询。

    【讨论】:

    • 但是query.executeUpdate(); 似乎在没有提交的情况下更新了数据库。如果我不使用查询,我可以调用 EntityManager.merge(),然后我必须调用 commit() 来提交事务,但我不知道更新数据库的最佳方法是什么。
    猜你喜欢
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多