2007年2月6日 星期二

Hibernate Secindary Level Cache 與Persistence Entity的繼承關係的問題

使用Hibernate的好處除了可以使用ORM的觀念來開發系統之外,另一個優點就是它提供了可以設定的cache機制 ,尤其是Secondary Level Cache。在對於經常使用到primary key來查詢的情況下,是有蠻大的幫助的。不過,最近在專案內使用卻發現一個問題。就是在有繼承關係的entity中,可能會造成一些問題:
例如,AUser跟BUser都繼承自User,而三者的繼承作法是採用Join的作法,也就是說AUser跟BUser都是參考到User的table。在還沒有使用Secondary level cache時,查詢一個已在AUser,但是不在BUser的entity,若是先以AUser的型態查詢,然後再以BUser的型態查詢則會正確的回傳null。但是當對User啟用Second level cache時,就會出現ClassCastException。原因應該是cache是以primary key來作為cache的key,所以第一次查詢的結果會被存入cache,但是第二次的查詢則因為是直接由cache取得,所以會得到AUser,但是由於查詢的型別是BUser,所以會出會轉型錯誤。

當然,這問題對於一般的系統可能是很難碰到。但是如果對於有應用到繼承觀念的系統的話,也許是需要特別注意的。