Java 使用条件查询休眠缓存

Java 使用条件查询休眠缓存,java,hibernate,caching,Java,Hibernate,Caching,所以,我的问题是我不确定我的查询是否被缓存。我现在拥有的hibernate.xml使用ehcache作为二级缓存 现在这是我的测试代码: Session session = HibernateUtil.getCurrentSession(); Criteria criteria = session.createCriteria(Users.class); criteria.add(Restrictions.eq("id", "777008")); Users u

所以,我的问题是我不确定我的查询是否被缓存。我现在拥有的hibernate.xml使用ehcache作为二级缓存

现在这是我的测试代码:

    Session session = HibernateUtil.getCurrentSession();
    Criteria criteria = session.createCriteria(Users.class);
    criteria.add(Restrictions.eq("id", "777008"));

    Users user = (Users) criteria.uniqueResult();

    HibernateUtil.closeCurrentSession();

    Session anotherSession = HibernateUtil.getCurrentSession();
    Criteria anotherCriteria = anotherSession.createCriteria(Users.class);
    anotherCriteria.add(Restrictions.eq("id", "777008"));

    Users anotherUser = (Users) anotherCriteria.uniqueResult();
HibernateUtil.getCurrentSession()
方法在
ThreadLocal
变量中检索当前会话(如果可用)。如果会话为null,则会创建一个会话

HibernateUtil.closeCurrentSession()
ThreadLocal
变量获取会话,如果该变量不为null,则将其关闭

每当我运行上面的代码时(这是一个JUnit测试),我只能看到一个从数据库中选择的Hibernate日志。我希望有两个,因为我没有使用
标准强制缓存任何内容。setCaching(true)

我相信第一级缓存只存在于会话范围内,而第二级缓存基本上是应用程序缓存。在两个<代码>标准的中间。 我的问题是,为什么我只看到一个HibernateSelect语句日志?我不应该看到两个吗

另外,当我转到hibernate.xml并禁用二级缓存时,仍然会出现相同的输出,这让我非常困惑

我看到的SELECT语句日志的示例:`Hibernate:从用户this_u中选择this_u.id作为id8_0,this_u.name作为name8_0,this_u.id=

编辑:这次我尝试了不同的方法。请参考以下代码段:

@Test
public void testCaching(){

    for (int i = 0; i < 10; i++){


        try {
            Thread.sleep(3000);

            logger.info("Retrieving user.");
            Session session = HibernateUtil.getCurrentSession();
            Criteria criteria = session.createCriteria(Users.class);
            criteria.add(Restrictions.eq("id", "777008"));
            criteria.setCacheable(true); 

            Users user = (Users) criteria.uniqueResult();

        }
        catch (Exception ex){
            System.out.println("Got it");
        }
        finally{
            HibernateUtil.closeCurrentSession();

        }
    }
}
@测试
公共void testCaching(){
对于(int i=0;i<10;i++){
试一试{
睡眠(3000);
logger.info(“检索用户”);
Session Session=HibernateUtil.getCurrentSession();
条件=session.createCriteria(Users.class);
标准。添加(限制。等式(“id”,“777008”));
条件。可设置缓存(true);
Users user=(Users)criteria.uniqueResult();
}
捕获(例外情况除外){
System.out.println(“明白了”);
}
最后{
HibernateUtil.closeCurrentSession();
}
}
}
因此,现在,每次测试调用
Criteria.uniqueResult()
,它都会显示一个Hibernate日志。所以现在,我关心的是我是否缓存了任何东西?使用此测试启用二级缓存(ehcache)


编辑2:好吧,现在,我想知道为什么它没有缓存。事实证明,我必须将
放入对象XML的
中。但是,我不能这样做,因为其他应用程序也在使用XML。是否只在应用程序上启用缓存?

您会看到一个查询,因为id=777008的用户对象已经在Hibernate上下文中。尝试使用name字段而不是@Id字段进行查询,您将看到两个查询


此外,查询缓存可以在您的配置中全局打开,而无需为特定查询设置它

既然它已经在Hibernate上下文中,这是否意味着它被缓存了?为什么要使用名称字段?我只能使用ID字段进行查询。我不能将它全局配置为缓存,因为我不允许这样做。其他应用程序也在使用hibernate.xml。对不起,我的意思是,如果您使用的查询不是基于id的,而是其他属性,那么您将看到两个查询。是的,最近的对象缓存在hibernate上下文中,基于id的搜索首先进入该上下文。因此,例如,如果您有一些@OneToMany用户集合(除非您有批量获取),那么您将不会看到所有用户的sql语句,而只会看到那些尚未在上下文中的用户的sql语句。Hmmm。。你在Hibernate上下文中失去了我。我相信只有两种类型的缓存:第一级缓存(会话范围)和第二级缓存(应用范围)。您指的是哪个范围?它不能在会话范围内,因为我在第一次查询后关闭了会话。它可能不在应用程序范围内,因为当我在Hibernate中启用二级缓存时,我仍然得到相同的结果:/它将与sessionFactory(配置)相关,而不是单个会话(因此我猜它被称为应用程序范围)。好的。因此,我将改变这个问题,并询问您,是否存在在特定实体上启用缓存(可能通过SessionFactory?),因为我无法更改当前的Hibernate配置。配置中启用了ehcache,但实体没有标记