2012-10-22 68 views
0

這是我的場景:在新實體上休眠第二級集合緩存

我有一個跨2個spring事務(P = Required,I = Default)的進程。

在T1上,我實例化了一個Entity A,它有一個B的空集合。

A和B實體以及oneToMany關係都使用@Cache批註標記。我嘗試了CacheConcurrencyStrategy.READ_WRITE和CacheConcurrencyStrategy.NONSTRICT_READ_WRITE。

我使用ehcache作爲緩存提供程序。

在T1上,我合併了一個實體。

在T2上,我再次合併它。

問題是,無論何時A實體在T2上合併,hibernate都會對B的集合進行查詢,因爲他無法在二級緩存中找到它。

只要集合被加載,緩存就會被使用(如果我在新事務T3上做了同樣的合併,它從緩存中獲取集合)。

如何避免此查詢被執行? I.E:如何使hibernate在加載之前對新創建的集合進行二級緩存?

此外,我想過使用第一級緩存,不知何故設法讓一個hibernate會話在T1和T2上線程化,但我不確定它是否適用於集合...)這是一個可接受的程序嗎?如何實現這一目標?

TKS。

回答

0

對於您指定的問題,即「問題是,無論何時在T2上合併A實體,hibernate都會爲B的集合執行查詢,因爲他無法在二級緩存中找到它。」 你必須檢查hibernate的inverse property。只需設置inverse=true的值,它不會再次獲取B的集合。 您會在link找到逆特性的詳細說明。

我希望這會幫助你理解與逆性質有關的其他問題。

+1

嗨kamlesh,謝謝你的回答。 我使用JPA批註,而且我的A-B oneToMany關係已經在使用「mappedby」(我預計它具有相同的逆效果)屬性,即A是弱方。 但是,我所說的情景依然存在。我通過創建B集合來實現它,該集合在field聲明中實例化爲null而不是空的。 看起來像hibernate區分空集和空集合後續 –

+0

我忘記提及即使對於空集合也執行查詢。雖然我的解決方案取消集合只適用於新創建的實體,但它現在解決了我的商業案例(其中80%是在空集合上查詢的),並且我停止了進一步的研究。當然,我仍然想要一個100%的解決方案。 –