我有以下代码:
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的缓存中搜索对象。以下示例在调用uniqueResult
时返回null。有没有办法检索尚未提交到数据库的已保存对象?
答案 0 :(得分:1)
如果您搜索的不是ID,那么Hibernate将不会使用第一级缓存。 Hibernate get和load默认与第一级缓存相关,但条件查询不是。在你的情况下,我方有两个解决方案
通过刷新会话=只需刷新你的会话就像这个session.flush();
一样,这样会话中的数据将与数据库同步,因此我会生成Id并且作为结果,Criteria查询将在数据库中找到结果并且将会结果清单给你。
启用hibernate二级缓存=您可以通过hhnate缓存提供程序(如ehCache)启用二级缓存并应用此技巧。
答案 1 :(得分:0)
您可以使用无状态会话但要注意: 这些实体不会绑定到任何会话,如果您想要解决关系或懒惰字段,您将获得例外!
答案 2 :(得分: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();
答案 3 :(得分:0)
除了使用TestNg测试框架外,我们做了类似的事情。几个答案讨论了session.flush()方法调用。这是对的。对flush的调用告诉Hibernate做了几件事,包括确保当前在队列中等待的所有数据库调用都被执行并从队列中清除。
答案 4 :(得分:0)
即使您在用户名的基础上进行选择,它也会返回数据。它没有返回null。