jpa FlushModeType COMMIT

时间:2015-12-05 17:48:29

标签: jpa-2.0

在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究竟做了什么?

提前帮忙。

1 个答案:

答案 0 :(得分:0)

javadocsFlushModeType COMMIT

中提及此问题
  

在事务提交时刷新。提供商可以刷新   其他时间,但不是必需的。

因此,如果提供者认为它应该可以刷新,即使它被配置为在提交时刷新。因为对于AUTO设置,提供程序通常会在不同时间刷新(这需要对所有托管实体进行昂贵的遍历 - 特别是如果数量很大 - 检查是否需要安排任何数据库更新/删除)所以如果我们确定有没有发生数据库更改然后我们可以使用COMMIT设置来减少对任何更改的频繁检查并节省一些CPU周期。