我有以下代碼的等效代碼和Hibernate配置(基本上,StreamRef屬於磁帶,並且必須在該磁帶上唯一的):Hibernate如何能夠拋出NonUniqueObjectException與setCacheMode(CacheMode.IGNORE)?
<class name="StreamRef" table="StreamRefToTape">
<composite-id> <key-property name="UUID"/>
<key-many-to-one class="Tape" name="tape">
<column name="Tape_TapeId" not-null="true"/>
</key-many-to-one>
</composite-id>
...</class>
<class name="Tape" table="Tape">
<id column="TapeId" name="tapeId"/></class>
我有幾百萬,這些StreamRef的,我要保存他們都在同一個事務中,但我也想在這個事務中保存RAM。
所以我嘗試了下面的代碼,我的假設是如果我關閉CacheMode,那麼它不會在內部跟蹤對象,所以它會節省很多內存(這在某種程度上似乎有所幫助)。但在測試這個假設的時候,是這樣的:
session = sessionFactory.openSession();
session.setCacheMode(CacheMode.IGNORE); // disable the first level cache
session.beginTransaction();
Tape t = new Tape();
StreamRef s1 = new StreamRef("same uuid");
StreamRef s2 = new StreamRef("same uuid"); // force a primary key collision
session.saveOrUpdate(t);
for(StreamRef s : t.getStreams()) {
session.save(s);
}
session.commit();
我本來期望這不提價,是因爲我關掉CacheMode參數(但它提出了一個NonUniqueObjectException https://gist.github.com/4542569)。有人可以確認1)休眠內部緩存是而不是禁用? 2)這個異常與CacheMode無關?有什麼辦法來完成我想在這裏
有點關係(在事務中未用完噸休眠RAM的?):https://stackoverflow.com/a/3543740/32453
(作爲一個方面的問題......這很重要的順序setCacheMode被稱爲vin與beginTransaction的關係?我認爲它不?)
非常感謝。
如果使用'session.merge()'而不是'session.save()' – Charlie
以及某種程度的合併,相等檢查比較失敗。嗯... https://gist.github.com/4542563 – rogerdpack