hibernate Transactional和sql查询vs条件查询

时间:2015-11-19 15:07:22

标签: java hibernate

在@Transitional方法

中进行查询时遇到了问题

以下是代码:

@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. 的结果
  3. 如果我只评论第13行 然后我将在标准搜索和SQL搜索中获得所有结果

  4. 如果我不评论第13行 然后我将从sql搜索获得结果。

  5. 我的问题是:

    1. 为什么我可以在执行条件搜索后获得sql搜索结果?
    2. 为什么我在sesson.persist()之后无法获得sql结果?

2 个答案:

答案 0 :(得分:0)

使用默认刷新模式时,在运行基于Criteria的查询之前会刷新Hibernate会话。在运行基于SQL的查询之前,Hibernate会话刷新。

以下是有关Hibernate如何与本机SQL查询一起使用的更多信息:http://vladmihalcea.com/the-dark-side-of-hibernate-auto-flush/

答案 1 :(得分:0)

您遇到了与刷新待处理的数据库更新相关的问题。 Hibernate通过在需要时不刷新对DB的更改来进行优化。当您执行hibernate理解的查询时,它会在必要时刷新。问题是,hibernate不会查看您正在执行的SQL并找出查询所依赖的实体,因此它不会刷新任何内容。当您使用SQL时,您应该使用诸如addSynchronizedEntityClassaddSynchronizedEntityName之类的方法来告诉hibernate SQL查询触及哪些实体。

尝试类似:

session.createSQLQuery("SELECT * FROM Orders").addSynchronizedEntityClass(ReportOrder.class).list()