Спящий режим: Тип каскада
Пусть у меня есть объект A
и entity B
. Entity A
имеет отношение @OneToOne
к B
.
Я хочу сделать следующее:
если я удалю A, тогда B также должен быть удален.
Если я удалю B, то A не будет удалено.
В каком объекте я должен установить
@OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
и в какой стороне я должен установить
@OneToOne(cascade = {CascadeType.ALL})
?
Ответы
Ответ 1
Каскад от A до B должен быть помещен в поле, ссылающееся на B
в классе A
, каскад от B до A должен быть помещен в поле, ссылающееся на A
в классе B
.
public class A {
@OneToOne(cascade = {CascadeType.ALL})
B b;
}
Должно быть в классе A
, так как вы хотите, чтобы каждое действие каскадировалось до B
.
public class B {
@OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
A a;
}
Должно быть в классе B
, так как вы хотите, чтобы определенные действия каскадировались на A
Ответ 2
если A "имеет" B, тогда вы должны определить CascadeType.ALL в A:
public class A {
// changes to A cascade to B
@OneToOne(cascade = {CascadeType.ALL})
B b
}
Ответ 3
Если класс A имеет класс B, тогда CascadeType.ALL будет добавлен к B.
то
Public Class A
{
Private B b;
@OneToOne(cascade = CascadeType.ALL)
public B getB() {
return this.b;
}
public void B(B b) {
this.b = b;
}
}
для более подробной информации этот пример