如何使用Web服务和EclipseLink作为JPA提供程序更新数据库?

时间:2012-02-21 11:42:11

标签: java database web-services jpa eclipselink

我使用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().commit();后我不需要使用em.getTransaction().begin()query.executeUpdate()似乎更新了数据库,而不是提交调用。为什么会这样?推荐什么?

2 个答案:

答案 0 :(得分:2)

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

您使用的是哪种类型的交易? JTA还是RESOURCE_LOCAL?如果您使用的是JTA,则必须使用JTA开始提交事务。

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

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

答案 1 :(得分: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. 数据库保留'OLD'值,直到em.getTransaction().commit()
  2. SELECT查询从持久化上下文返回“NEW”