有关在调用查询之前使用JPA进行刷新的问题

时间:2010-12-11 04:33:05

标签: java jpa transactions flush

这是一个简单的问题,但是这段代码中需要刷新吗?请注意,这将在JPA事务中。

User user = new User();
em.persist(user);

em.flush;

User aUser = em.find(User.class,user.getId());
assert(user.equals(aUser));

或者没有冲洗它会起作用吗?

User user = new User();
em.persist(user);

User aUser = em.find(User.class,user.getId());
assert(user.equals(aUser));

或同样的问题,但更多涉及的例子:

User user = em.find(User.class,id);
user.setName("My Name");
em.merge(user);

em.flush; //Is this line needed?

User aUser = em.createQuery("select u from User where u.name = 'My Name');
assert(user.equals(aUser));

1 个答案:

答案 0 :(得分:8)

在第一种情况下,只要User具有自动生成的ID,就需要刷新,因为它在刷新之前未分配。如果未生成idem.find()将从持久性上下文返回相同的实例,因此不需要刷新。

在第二种情况下,不需要显式刷新,因为JPA在自动执行查询之前执行刷新(如果刷新模式为AUTO,则默认情况下,否则需要显式刷新。