Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查询Hibernate缓存_Java_Hibernate_Hibernate Cache - Fatal编程技术网

Java 查询Hibernate缓存

Java 查询Hibernate缓存,java,hibernate,hibernate-cache,Java,Hibernate,Hibernate Cache,我有以下代码: 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 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。有没有办法检索尚未提交到数据库的已保存对象?

如果搜索的不是ID,则Hibernate将不使用一级缓存。默认情况下,Hibernate get and load与一级缓存相关,但条件查询不相关。在你的情况下,我这边有两个解决方案

  • 通过刷新会话=像下面这样刷新会话
    session.flush()执行此操作时,来自会话的数据将同步到数据库,因此将生成Id,并且作为结果条件查询将在数据库中找到结果,并将结果列表发送给您

  • Enable hibernate second level cache=您可以通过hibernate缓存提供程序(如ehCache)启用二级缓存并应用技巧


  • 您可以使用无状态会话,但需要注意:
    这些实体不绑定到任何会话,如果您想解析关系或惰性字段,则会出现异常

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

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

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