Hibernate 4 二级缓存 hibernate 不与关联 (EhCache) 一起工作
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().包含(Team.class, 1); returns 是的
但是 session.getCache().contains(Player.class, 1) returns false
当我尝试获得加载球队的球员时,
Player player = playerDao.getPlayer(1);
Hibernate 生成一个 select 来获取玩家,即使加载的团队包含该玩家
Player player = team.getPlayer().get(0);
我的实体注释有问题吗?我不知道为什么它对我不起作用。
感谢您的帮助
解决方法是配置查询缓存,使用springxml配置:
<prop key="hibernate.cache.use_query_cache">true</prop>
因为 HQL 请求 createQuery(query) 不会将结果添加到二级缓存级别,不像 hibernate 方法,例如 get、load、save、update...
在 HQL 查询中使用 setCacheable(true) 告诉 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().包含(Team.class, 1); returns 是的 但是 session.getCache().contains(Player.class, 1) returns false
当我尝试获得加载球队的球员时,
Player player = playerDao.getPlayer(1);
Hibernate 生成一个 select 来获取玩家,即使加载的团队包含该玩家
Player player = team.getPlayer().get(0);
我的实体注释有问题吗?我不知道为什么它对我不起作用。
感谢您的帮助
解决方法是配置查询缓存,使用springxml配置:
<prop key="hibernate.cache.use_query_cache">true</prop>
因为 HQL 请求 createQuery(query) 不会将结果添加到二级缓存级别,不像 hibernate 方法,例如 get、load、save、update...
在 HQL 查询中使用 setCacheable(true) 告诉 hibernate 将结果放入查询缓存中。
唯一剩下的小问题是它不适用于一组团队(它只适用于一个团队)。