Hibernate缓存同步问题

环境:
OS : Win XP SP2
Hibernate: 3.5.1

伪代码: [code="java"]

    System.out.println(StringUtils.center("query 查询: " ));

    Session session = HibernateSessionFactory.getSession();
    String hql = "FROM Room T WHERE T.address = ?";
    Query query = session.createQuery(hql).setParameter(0, "Shanghai");
    query.setCacheable(true);
    Room room = (Room) query.list().get(0);
    HibernateSessionFactory.closeSession();

    System.out.println(StringUtils.center("更新: " ));

    Session session2 = HibernateSessionFactory.getSession();
    Transaction tx = session2.beginTransaction();
    room.setSize(60);
    session2.update(room);
    tx.commit();
    HibernateSessionFactory.closeSession();

    System.out.println(StringUtils.center("load查询(已同步缓存): " ));

    Session session3 = HibernateSessionFactory.getSession();
    room = (Room) session3.load(Room.class, new Long(2));
    Hibernate.initialize(room);
    HibernateSessionFactory.closeSession();
    System.out.println(room.getSize());

    System.out.println(StringUtils.center("query 查询(未同步缓存): "));
    Session session4 = HibernateSessionFactory.getSession();
    query = session4.createQuery(hql).setParameter(0, "Shanghai");
    query.setCacheable(true);
    room = (Room) query.list().get(0);
    HibernateSessionFactory.closeSession();

[/code]
[size=xx-large]hibernate.cache.use_query_cache 和 和 setCacheable(true) 都已配置过

疑问: 两次查询条件都一样, 中间修改了实体, 为什么第二次query查询还是发送了sql, 如果同步了缓存应该不会发送, 请指教. 谢谢.[/size]

参考一下http://www.iteye.com/topic/18904

二级缓存配置的一般配置:对照下是否有遗漏呢?

1、首先要打开二级缓存,在hibernate.cfg.xml中添加如下配置:

true

2、Hibernate的二级缓存使用第三方的缓存工具来实现,所以我们需要指定Hibernate使用哪个

缓存工具。如下配置指定Hibernate使用EhCache缓存工具。

org.hibernate.cache.EhCacheProvider

3、Hibernate在默认情况下并不会对所有实体对象进行缓存,所以,我们需要指定缓存哪些对象,

在实体对象的映射文件中(相应的标签内部),添加如下配置:

usage="read-only"是“只读”缓存策略。

注意,这个标签只能放在标签的内部,而且必须处在标签的前面!!!

这个标签放在哪些标签下面,就说明会多这些类的对象进行缓存

4、对于第3步,有一个可选的方案是在hibernate.cfg.xml文件中指定哪些类的对象需要缓存,

而不需要使用标签来指定。如:

在hibernate.cfg.xml中添加如下配置:

注意,这个标签必须放在标签的后面!!