我使用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()
似乎更新了数据库,而不是提交调用。为什么会这样?推荐什么?
答案 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'
我的解释方法(请纠正我,如果我错了):
em.getTransaction().commit()
。