在@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 搜索中得到结果。
我的问题是:
- 为什么执行条件搜索后可以得到sql搜索结果?
- 为什么我在 sesson.persist() 之后无法得到 sql 结果?
最佳答案
您遇到了与刷新待定数据库更新相关的问题。 Hibernate 通过在需要时不刷新对数据库的更改来进行优化。当您执行 hibernate 理解的查询时,它会根据需要刷新。问题是 hibernate 不会查看您正在执行的 SQL 并找出查询所依赖的实体,因此它不会刷新任何内容。当您使用 SQL 时,您应该使用诸如 addSynchronizedEntityClass
或 addSynchronizedEntityName
之类的方法来告诉 Hibernate SQL 查询涉及哪些实体。
尝试这样的事情:
session.createSQLQuery("SELECT * FROM Orders").addSynchronizedEntityClass(ReportOrder.class).list()
关于java - hibernate 事务和 sql 查询与条件查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33807489/