Hibernate 4二级缓存hibernate无法使用关联(EhCache)

时间:2015-02-22 20:17:45

标签: java spring hibernate ehcache

我是hibernate的新手,我正在尝试二级缓存。

我的实体是Team:OneToMany:Player

团队实体:

@Entity
@Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class Team {

    ...

    @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
    @OneToMany(fetch=FetchType.LAZY, mappedBy="team")
    @Cascade(CascadeType.ALL)
    private List<Player> players; 

    ...
}

玩家实体:

@Entity
@Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class Player extends Person {

    ... 

    @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
    @ManyToOne(fetch=FetchType.LAZY)
    @Cascade(CascadeType.SAVE_UPDATE)
    private Team team;

    ....    
}

我的TeamDao是:

    @Repository
    public class TeamDao {

        @Autowired
        private SessionFactory sessionFactory;

        ...

        @Transactional
        public Team getTeam(Integer id) {
            return (Team) sessionFactory.getCurrentSession().createQuery("from team t inner join fetch t.players p where t.id = :tid")
                  .setParameter("tid", id)
                  .setCacheable(true)
                  .uniqueResult();

        }

        ...
    }

当我加载团队例如id = 1时,我在二级缓存中找到它。但即使关联被声明为可缓存,我也没有找到加载团队的玩家列表。 session.getCache()。contains(Team.class,1);返回true 但是session.getCache()。contains(Player.class,1)返回false

当我尝试获得加载团队的玩家时,

Player player = playerDao.getPlayer(1); 

即使已加载的团队包含此播放器

,Hibernate也会生成一个选择以获取播放器
Player player = team.getPlayer().get(0);  

我的实体注释中是否存在问题?我不知道为什么它对我不起作用。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

解决方案是使用spring xml配置配置查询缓存:

<prop key="hibernate.cache.use_query_cache">true</prop>

因为HQL请求createQuery(查询)没有将结果添加到第二个缓存级别,而不像hibernate方法如get,load,save,update,...

在HQL查询中使用setCacheable(true)告诉hibernate将结果放入查询缓存中。

唯一剩下的小问题是它不适用于一组团队(它适用于一个团队)。