【发布时间】:2023-03-28 01:46:01
【问题描述】:
我有一个像这样的对象树:
Foo->(Many)Bar->Baz
我想让它们都是瞬态的,但在 Foo 上调用 detach 只会分离 Foo。我也不想清除会话,因为会话中可能还有其他需要保留的内容。
有没有办法不用爬满树?或者在加载 Foo 的原始查询中是否有办法说不应该附加任何返回的对象?
【问题讨论】:
我有一个像这样的对象树:
Foo->(Many)Bar->Baz
我想让它们都是瞬态的,但在 Foo 上调用 detach 只会分离 Foo。我也不想清除会话,因为会话中可能还有其他需要保留的内容。
有没有办法不用爬满树?或者在加载 Foo 的原始查询中是否有办法说不应该附加任何返回的对象?
【问题讨论】:
Hiberante 的 detach 方法就是这样做的:
public void detach(Object entity) {
try {
getSession().evict( entity );
}
catch ( HibernateException he ) {
throw convert( he );
}
}
它或多或少像:您已经拥有该对象,因此,让我们将其从会话中逐出,使其分离。你可以做的是在这个属性上级联EVICT,所以当Foo被驱逐时,Bar也会被驱逐,Baz也是如此。为了避免LazyInitializationException,您需要保证它们都已加载(也许FetchType EAGER?)
对于 3.5,您有 CascadeType DETACH,可用于此目的:http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/CascadeType.html
【讨论】: