Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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 4二级缓存Hibernate未使用关联(EhCache)_Java_Spring_Hibernate_Ehcache - Fatal编程技术网

Java Hibernate 4二级缓存Hibernate未使用关联(EhCache)

Java Hibernate 4二级缓存Hibernate未使用关联(EhCache),java,spring,hibernate,ehcache,Java,Spring,Hibernate,Ehcache,我刚开始休眠,正在尝试二级缓存 我的实体是团队:一家公司:玩家 团队实体: @Entity @Cacheable @Cache(usage=CacheConcurrencyStrategy.READ_WRITE) public class Team { ... @Cache(usage=CacheConcurrencyStrategy.READ_WRITE) @OneToMany(fetch=FetchType.LAZY, mappedBy="team") @

我刚开始休眠,正在尝试二级缓存

我的实体是团队:一家公司:玩家

团队实体:

@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;

    ....    
}
我的团队是:

    @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()包含(Team.class,1);返回true 但是session.getCache()contains(Player.class,1)返回false

当我试着让一名球员加入这个满负荷的队伍时

Player player = playerDao.getPlayer(1); 
Hibernate生成一个select来获取该玩家,即使加载的团队包含该玩家

Player player = team.getPlayer().get(0);  
我的实体注释有问题吗?我不知道为什么它对我不起作用


感谢您的帮助

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

<prop key="hibernate.cache.use_query_cache">true</prop>
true
因为HQL请求createQuery(查询)不会将结果添加到第二个缓存级别,而不像hibernate方法,如get、load、save、update

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


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

“它不适用于团队集合”。我面临的问题是,缓存可以与findOne()一起使用,但不能与findAll(List)一起使用。你知道怎么解决吗?