這是我的場景:在新實體上休眠第二級集合緩存
我有一個跨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。
嗨kamlesh,謝謝你的回答。 我使用JPA批註,而且我的A-B oneToMany關係已經在使用「mappedby」(我預計它具有相同的逆效果)屬性,即A是弱方。 但是,我所說的情景依然存在。我通過創建B集合來實現它,該集合在field聲明中實例化爲null而不是空的。 看起來像hibernate區分空集和空集合後續 –
我忘記提及即使對於空集合也執行查詢。雖然我的解決方案取消集合只適用於新創建的實體,但它現在解決了我的商業案例(其中80%是在空集合上查詢的),並且我停止了進一步的研究。當然,我仍然想要一個100%的解決方案。 –