Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate: Cascade Type

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})  

?

like image 575
Ilya Avatar asked May 11 '12 12:05

Ilya


People also ask

What is the cascade type in Hibernate?

Cascading is a phenomenon involving one object propagating to other objects via a relationship. It is transitive in nature and the cascade attribute in hibernate defines the relationship between the entities. The cascading types supported by the hibernate framework are as follow: CascadeType.

What is cascade type merge?

CascadeType. MERGE. The merge operation copies the state of the given object onto the persistent object with the same identifier. CascadeType. MERGE propagates the merge operation from a parent to a child entity.

What is CascadeType in JPA?

To establish a dependency between related entities, JPA provides javax. persistence. CascadeType enumerated types that define the cascade operations. These cascading operations can be defined with any type of mapping i.e. One-to-One, One-to-Many, Many-to-One, Many-to-Many.

What is Cascade annotation in Hibernate?

Cascading is a feature in Hibernate, which is used to manage the state of the mapped entity whenever the state of its relationship owner (superclass) affected. When the relationship owner (superclass) is saved/ deleted, then the mapped entity associated with it should also be saved/ deleted automatically.


1 Answers

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

like image 200
Lukazoid Avatar answered Oct 03 '22 05:10

Lukazoid