【发布时间】:2012-01-26 07:48:11
【问题描述】:
更新:我重写了这个问题,以尽可能地理解并提供最多的信息。
我有以下几点:
@Entity
public class FooLnkBar implements java.io.Serializable {
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "SomeID", nullable = false)
private Foo foo;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "OtherID", nullable = false)
private Bar bar;
}
@Entity
public class Foo implements java.io.Serializable {
@OneToMany(orphanRemoval=true, cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "foo")
private Set<FooLnkBar> fooLnkBars = new HashSet<FooLnkBar>(0);
}
案例 1:通过持久化 FooLnkBar 来保存所有内容
// This correctly saves everything into the database in one shot
Foo foo = new Foo();
Bar bar = new Bar();
FooLnkBar flb = new FooLnkBar();
flb.setFoo(foo);
flb.setBar(bar);
persist(flb);
案例2:修改一个FooLnkBar并持久化一个Foo
// Load a Foo from the database and get the set of FooLnkBars
Foo foo = loadFooFromDatabase();
Set<FooLnkBar> fooLnkBars = foo.getFooLnkBars();
// Delete all existing FooLnkBar objects. Alternatively use removeAll()
Iterator<FooLnkBar> it = fooLnkBars.iterator();
while (it.hasNext()) {
FooLnkBar o = it.next();
it.remove();
}
// Add some new FooLnkBars
Foo foo = new Foo();
Bar bar = new Bar();
FooLnkBar flb = new FooLnkBar();
fooLnkBars.add(flb);
foo.setFooLnkBars(fooLnkBars);
// Save all changes
persist(foo);
案例 2 不起作用。因为cascadeType,这也移除了FooLnkBar所在的Foo,所以案例2中的整个Foo对象都被删除了。这很糟糕。
此外,由于 FooLnkBar 是另一个表中的值,因此我想确保 hibernate 在尝试持久化它时不会将 Foo 视为重复行。
如果我从数据库中删除一个 Foo,则 FooLnkBar 也应该从数据库中删除。
如果我从数据库中删除 FooLnkBar,则不应从数据库中删除 Foo。
我正在寻找一种让所有案例都能正常工作的方法。
更新:更改此设置修复了案例 2,但破坏了案例 1:
@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinColumn(name = "SomeID", nullable = false)
private Foo foo;
案例 1 中的错误消息现在是“非空属性引用空值或瞬态值:FooLnkBar.foo”
【问题讨论】:
-
addSet方法到底是做什么的? -
在这个例子中这是一个虚拟方法,它将一组 ObjectTwos 添加到 ObjectOne
-
您能告诉我们您的 xml 映射代码吗?还是注解配置?
-
我为 ObjectTwo 设置了 (cascade = CascadeType.ALL)。有没有我应该使用的不同的替换而不是合并?
-
你试过
DELETE-ORPHAN和ALL一起使用吗? stackoverflow.com/questions/306144/…
标签: hibernate spring replace set