Hibernate 二级缓存示例

标签 hibernate ehcache

我正在开发 hibernate + ehcache 程序。

@Entity
@Table(name = "pizza")
public class Pizza implements Serializable{
    @Id
    @GeneratedValue
    private Integer id;
    private String name;
    private double price;

    public long getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

}

缓存文件
  <cache name="com.abp.osp.domain.Pizza"   
maxElementsInMemory="100"   
eternal="false"   
timeToIdleSeconds="5"   
timeToLiveSeconds="200" /> 
</ehcache>

我在 bean.xml 中提到了 ehcache
   <prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</prop>
        <prop key="hibernate.cache.use_second_level_cache">true</prop>
        <prop key="hibernate.cache.use_query_cache">true</prop>
        <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</prop>
         <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>

我在 dao 类中的调用方法是
 Session session1=sessionFactory.openSession();  

          Pizza pizza2=(Pizza)session1.load(Pizza.class, 2);
          System.out.println("pizza2--"+pizza2.getName());  
          session1.close(); 

 Session session2=sessionFactory.openSession();  

          Pizza pizza4=(Pizza)session2.load(Pizza.class, 2);
          System.out.println("pizza4--"+pizza4.getName());  
          session2.close(); 

输出是:
Hibernate: select pizza0_.id as id0_0_, pizza0_.name as name0_0_, pizza0_.price as price0_0_ from pizza pizza0_ where pizza0_.id=?
pizza2--Thin Crust
Hibernate: select pizza0_.id as id0_0_, pizza0_.name as name0_0_, pizza0_.price as price0_0_ from pizza pizza0_ where pizza0_.id=?
pizza4--Thin Crust

但是它在数据库中命中了两次。我在我的代码中没有发现任何错误。请告诉我为什么它在数据库中命中了两次。

最佳答案

我已经解决了我的问题。我需要补充

@Cache(usage=CacheConcurrencyStrategy.READ_ONLY,region="pizza")

在域类中。
@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY,region="pizza")
@Table(name = "pizza")
public class Pizza implements Serializable{

关于Hibernate 二级缓存示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20584585/

相关文章:

java - Hibernate - 保存方法的返回值而不是字段

java - Propagation.REQUIRES_NEW 会对我的应用造成什么附带影响

java - 重写 Spring + Hibernate 事务性注解

java - 无法打开 JDBC 连接以执行 DDL

java - EhCache:复制与分布式缓存配置

java - Infinispan相当于ehcache的copyOnRead和copyOnWrite

java - 解析依赖项时出现 Maven 错误

java - 使用 "mappedBy"与 super 类成员的多个 ManyToMany 关系

java - 缓存不一致 - 实体并不总是保留在缓存的集合中

java - EHCache 是如何实现它的事务的?