gpt4 book ai didi

java - Hibernate 4二级缓存hibernate不与关联一起工作(EhCache)

转载 作者:行者123 更新时间:2023-11-30 03:32:38 26 4
gpt4 key购买 nike

我是 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);返回真但 session.getCache().contains(Player.class, 1) 返回 false

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

Player player = playerDao.getPlayer(1); 

Hibernate 会生成一个选择来获取该玩家,即使加载的团队包含该玩家

Player player = team.getPlayer().get(0);  

我的实体注释有问题吗?我不知道为什么它对我不起作用。

感谢您的帮助

最佳答案

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

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

因为 HQL 请求 createQuery(query) 不会将结果添加到第二级缓存,不像 hibernate 方法,例如 get、load、save、update...

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

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

关于java - Hibernate 4二级缓存hibernate不与关联一起工作(EhCache),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28662739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com