更新:我重写了这个问题以尽可能多地理解并提供最多的信息。Spring/Hibernate替换一组级联对象
我有以下几点:
@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对象被删除。这不好。
此外,我想确保当我尝试持续它时,hibernate不会将Foo看作重复行,因为FooLnkBar是另一个表中的值。
如果我从数据库中删除Foo,FooLnkBar也应该从数据库中删除。
如果我从数据库中删除FooLnkBar,Foo不应该从数据库中删除。
我正在寻找一种方法来获取所有案例的工作。
更新:更改此修复案例2,但打破案例1:
@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinColumn(name = "SomeID", nullable = false)
private Foo foo;
在案例1中的错误消息现在是“非空属性引用null或瞬时值:FooLnkBar.foo”
'addSet'方法到底做了什么? – 2011-12-22 17:58:30
在这个例子中,这是一个虚拟的方法,将一组ObjectTwos添加到ObjectOne – user973479 2011-12-22 18:16:25
你能告诉我们你的xml映射代码吗?或注释配置? – 2011-12-22 18:25:56