【发布时间】:2013-01-16 06:06:59
【问题描述】:
我有以下代码和休眠配置的等效项(基本上,StreamRef 属于磁带,并且在该磁带上必须是唯一的):
<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,那么它不会在内部跟踪对象,因此它将节省大量 RAM(这在某种程度上似乎有所帮助)。但是在检验这个假设时,像这样:
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()会怎样 -
以某种方式合并相等性检查比较失败。嗯...gist.github.com/4542563