2015-11-19 4 views
3

я встретился с проблемой при выполнении запроса в @Transitional методеспящий режим транзакционной и SQL запрос против критерии запроса

Ниже приведен код:

@Test 
@Rollback 
@Transactional 
public void testFindOneReportOrderWithTwoItemWithSameFnsku() throws Exception 
{ 
    //Prepare the order 
    Session session = sessionFactory.getCurrentSession(); 
    ReportOrder order = new ReportOrder(); 
    order.setId(111111); 
    order.setCustomerId("test customer"); 

    session.persist(order); 
    // session.flush(); 

    System.out.println("Start ===================="); 
    System.out.println("criteria search:"); 
    session = sessionFactory.getCurrentSession(); 
    System.out.println(session.createCriteria(ReportOrder.class).list());  


    System.out.println("sql query:"); 
    System.out.println(session.createSQLQuery("SELECT * FROM Orders").list()); 


    System.out.println("End =========================="); 
} 

Тест:

  1. Если Я прокомментирую строку 13 «session.flush» и строку 17,18 «поиск критериев» , тогда я не получу результата в sql-запросе

  2. Если я комментирую линия 13 только тогда я буду получать все результаты в обоих критериев поиска и поиска SQL

  3. Если я не комментирую линия 13 то я получить результат от SQL поиска.

Моя проблема:

  1. Почему я могу получить результат SQL запроса после Выполнить поиск критериев?
  2. Почему я не могу получить результат sql после sesson.persist()?

ответ

0

При использовании режима очистки по умолчанию сеансы Hibernate очищаются перед запуском запросов на основе критериев. Сессии спящего режима: , а не сбрасываются перед запуском SQL-запроса.

Вот еще некоторая информация о том, как Hibernate работает с носителями запросов SQL: http://vladmihalcea.com/the-dark-side-of-hibernate-auto-flush/

0

Вы столкнулись с проблемами, связанные с промывкой в ​​ожидании обновления БД. Hibernate оптимизирует, не сбрасывая изменения в БД, пока это не понадобится. Когда вы выполняете запрос, который понимает спящий режим, он сбрасывается по мере необходимости. Проблема в том, что hibernate не смотрит на SQL, который вы выполняете, и выясните, из каких сущностей зависит запрос, поэтому он ничего не смывает. Когда вы используете SQL, вы должны использовать такие методы, как addSynchronizedEntityClass или addSynchronizedEntityName, чтобы сообщить hibernate, какие объекты затронуты SQL-запросом.

Try что-то вроде:

session.createSQLQuery("SELECT * FROM Orders").addSynchronizedEntityClass(ReportOrder.class).list() 
Смежные вопросы