Обновление: я переписал вопрос, чтобы сделать его максимально понятным и предоставить больше информации.
У меня есть следующее:
@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 это также удаляет Foo, в котором находится FooLnkBar, поэтому весь объект Foo в случае 2 удаляется.Это плохо.
Кроме того, я хочу убедиться, что 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 теперь "свойство not-null указывает на нулевое или временное значение: FooLnkBar.foo"