Reputation: 29673
Let's I have entity A
and entity B
. Entity A
have @OneToOne
relationship with B
.
I want do next:
if I remove A then B must be removed also.
If I remove B then A isn't removed.
In which entity I must set
@OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
and in which side I must set
@OneToOne(cascade = {CascadeType.ALL})
?
Upvotes: 17
Views: 47350
Reputation: 836
If Class A has Class B then CascadeType.ALL will be appiled on B. then
Public Class A
{
Private B b;
@OneToOne(cascade = CascadeType.ALL)
public B getB() {
return this.b;
}
public void B(B b) {
this.b = b;
}
}
for more read this example
Upvotes: 0
Reputation: 19416
The cascade from A to B should be placed on the field referencing B
in class A
, the cascade from B to A should be placed on the field referencing A
in class B
.
public class A {
@OneToOne(cascade = {CascadeType.ALL})
B b;
}
Should be in class A
, as you want every action to be cascaded to B
.
public class B {
@OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
A a;
}
Should be in class B
, as you only want certain actions cascaded to A
Upvotes: 33
Reputation: 2975
if A "has" B, then you must define CascadeType.ALL in A:
public class A {
// changes to A cascade to B
@OneToOne(cascade = {CascadeType.ALL})
B b
}
Upvotes: 3