簡體   English   中英

休眠4二級緩存休眠不與關聯(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()。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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM