在@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 ==========================");
}
测试是:
如果我评论第13行" session.flush"和第17,18行"条件搜索" 然后我将得不到sql查询
如果我只评论第13行 然后我将在标准搜索和SQL搜索中获得所有结果
如果我不评论第13行 然后我将从sql搜索获得结果。
我的问题是:
答案 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时,您应该使用诸如addSynchronizedEntityClass
或addSynchronizedEntityName
之类的方法来告诉hibernate SQL查询触及哪些实体。
尝试类似:
session.createSQLQuery("SELECT * FROM Orders").addSynchronizedEntityClass(ReportOrder.class).list()