7

我有以下代码:

Person a = new Person();
a.setName("John");

Session session = openHibernateSession();

session.beginTransaction();

session.saveOrUpdate(a);

Criteria critera = session.createCriteria(Person.class);
critera.add(Restrictions.eq("name","John"));
Person personFromCache = (Person) criteria.uniqueResult();

...

session.commit();

我想要的是能够从数据库和 Hibernate 的缓存中搜索对象。以下示例在调用时返回 null uniqueResult。有没有办法检索尚未提交到数据库的已保存对象?

4

5 回答 5

1

如果您搜索的不是 ID,那么 Hibernate 将不会使用一级缓存。Hibernate get 和 load 默认与一级缓存相关,但条件查询不相关。在您的情况下,我有两种解决方案

  1. 通过刷新会话 = 只需像这样刷新会话,session.flush();同时会话中的数据将同步到数据库,因此将生成 Id,结果条件查询将在数据库中找到结果并将结果列表提供给您。

  2. 启用休眠二级缓存 = 您可以通过 ehCache 等休眠缓存提供程序启用二级缓存并应用该技巧。

于 2013-02-25T13:15:59.703 回答
0

除了使用 TestNg 测试框架,我们做了一些类似的事情。一些答案讨论了 session.flush() 方法调用。这是对的。对刷新的调用告诉 Hibernate 做几件事,包括确保当前在队列中等待的所有数据库调用都被执行并从队列中清除。

于 2013-03-14T20:25:04.373 回答
0

您可以使用 StatelessSession 但请注意:这些实体未绑定到任何会话,如果您想解决关系或惰性字段,您将获得异常!

于 2013-02-25T13:58:06.223 回答
0
session.beginTransaction();

session.saveOrUpdate(a);

session.flush();

Criteria critera = session.createCriteria(Person.class);
critera.add(Restrictions.eq("name","John"));
Person personFromCache = (Person) criteria.uniqueResult();
于 2013-03-08T01:46:04.357 回答
0

即使您根据用户名进行选择,它也会返回数据。它不返回 null。

于 2014-10-31T20:25:46.077 回答