在FlushModeType.AUTO模式下,持久性上下文在以下时间与数据库同步:
before each SELECT operation
at the end of a transaction
after a flush or close operation on the persistence context
在FlushModeType.COMMIT模式下,意味着它不必刷新 执行查询之前的持久化上下文,因为您已指出内存中没有更改的数据会影响数据库查询的结果。
我在jboss中做了一个例子6.0:
@Stateless
public class SessionBeanTwoA implements SessionBeanTwoALocal {
@PersistenceContext(unitName = "entity_manager_trans_unit")
protected EntityManager em;
@EJB
private SessionBeanTwoBLocal repo;
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void findPersonByEmail(String email) {
1. List<Person> persons = repo.retrievePersonByEmail(email);
2. Person person = persons.get(0);
3. System.out.println(person.getAge());
4. person.setAge(2);
5. persons = repo.retrievePersonByEmail(email);
6. person=persons.get(0);
7. System.out.println(person.getAge());
}
}
@Stateless
public class SessionBeanTwoB extends GenericCrud implements SessionBeanTwoBLocal {
@Override
public List<Person> retrievePersonByEmail(String email) {
Query query = em.createNamedQuery("Person.findAllPersonByEmail");
query.setFlushMode(FlushModeType.COMMIT);
query.setParameter("email", email);
List<Person> persons;
persons = query.getResultList();
return persons;
}
}
FlushModeType.COMMIT似乎不起作用。在第1行,该人的年龄取自数据库,并在第3行打印35。在第4行,该人在持续上下文内更新,但在第7行。该人的年龄为2岁。
jpa 2.0规范说:
设置Type.COMMIT,在查询时对持久性上下文中的实体所做的更新的效果是 未指定的。
但是在很多书中,他们都解释了我在这篇文章开头写的内容。
那么FlushModeType COMMIT究竟做了什么?
提前帮忙。
答案 0 :(得分:0)
javadocs在FlushModeType
COMMIT
在事务提交时刷新。提供商可以刷新 其他时间,但不是必需的。
因此,如果提供者认为它应该可以刷新,即使它被配置为在提交时刷新。因为对于AUTO设置,提供程序通常会在不同时间刷新(这需要对所有托管实体进行昂贵的遍历 - 特别是如果数量很大 - 检查是否需要安排任何数据库更新/删除)所以如果我们确定有没有发生数据库更改然后我们可以使用COMMIT设置来减少对任何更改的频繁检查并节省一些CPU周期。