[英]Hibernate 4 second level cache hibernate is not working with association (EhCache)
我是休眠的新手,正在嘗試二級緩存。
我的實體是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);
我的實體注釋中有問題嗎? 我不知道為什么它對我不起作用。
感謝您的幫助
解決方案是使用spring xml configuration配置查詢緩存:
<prop key="hibernate.cache.use_query_cache">true</prop>
因為HQL請求createQuery(query)不會將結果添加到第二個緩存級別,這與諸如get,load,save,update等的休眠方法不同。
在HQL查詢中使用setCacheable(true)告訴hibernate將結果放入查詢緩存中。
唯一剩下的小問題是它不適用於一組團隊(僅適用於一個團隊)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.