2015-12-05 3 views
0

В режиме FlushModeType.AUTO контекст живучесть синхронизируется с базой данных в следующих случаях:JPA FlushModeType COMMIT

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. возраст человека берется из базы данных и печатает 35 в строке 3. В строке 4, человек обновляется в постоянной связи, но в строке 7. возраст человека равен 2.

JPA 2.0 Спецификация говорит:

Type.COMMIT установлен, эффект обновления сделанные для сущностей в контексте персистентности по запросам, - не указано.

Но во многих книгах они объясняют, что я написал в начале этого сообщения.

Итак, что же делает FlushModeType COMMIT?

Tks заранее за вашу помощь.

ответ

0

javadocs упоминает об этом здесь FlushModeTypeCOMMIT

Промывка происходит при фиксации транзакции. Провайдер может зафрахтовать на другие времена, но не требуется.

Так что если провайдер считает, что это необходимо, он может зафрезить, даже если он настроен на флеш при фиксации. Поскольку для настройки AUTO поставщик обычно сбрасывается в разное время (что требует дорогого обхода всех управляемых объектов, особенно если это число огромно, чтобы проверить, нужно ли планировать какие-либо обновления/удаления базы данных), поэтому, если мы уверены, что есть никаких изменений базы данных не происходит, тогда мы можем использовать настройку COMMIT для сокращения частого контроля за любыми изменениями и сохранения на некоторых циклах ЦП.

Смежные вопросы