hibernate:如果父级是新的,则不会级联更新到子层

时间:2012-10-08 21:32:37

标签: java hibernate

我有一个像这样的hibernate映射的类:                                                ...    

基本上我用一些StreamRef传播一个新的(或旧的)磁带,然后点击

 session.saveOrUpdate(tapeInstance);

如果磁带是旧的或新的。我添加的streamrefs都是新的(但如果我从数据库中检索磁带,我希望能够轻松访问其streamrefs。)

不幸的是,似乎我不能成为懒惰的"我想要的 - 我想要的行为,基本上是#34;如果磁带是新的,那么这意味着它的所有流都是新的,所以永远不要检查是否可以对它们进行更新,总是只需插入它们",然而"如果磁带是旧的,更新它,删除它的旧的streamrefs,然后添加新的streamrefs - 它们总是新的/唯一的,所以只需添加他们"所以基本上,不要通过级联更新,但是通过级联保存。这可能吗?

我通过设置cascade =" merge,delete,lock,refresh,evict,replicate,delete-orphan"来解决这个问题。 (基本上,它缺少保存更新),然后手动删除所有旧流,然后手动添加每个流,一次一个。还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

通过cascade =“AllDeleteOrphan”,可以通过列表插入和删除。为避免更新,我们需要为主键正确指定未保存的值。然后,NHibernate将使用主键的值来确定它是新实例还是现有实例。注意:通过使用“AllDeleteOrphan”级联选项,如果删除了tapeInstance,则会删除所有关联的streamref。