01. 영속성 전이
1:1 단방향 연관의 예를 들면 두 엔티티를 새로 생성한 뒤 저장하려면 EntityManager.persist()를 이용해서 두 엔티티를 모두 저장해야 한다. 이럴 때 영속성 전이를 사용하면 연관된 객체를 손쉽게 함께 저장할 수 있다.
영속성 전이는 엔티티의 영속성 상태 변화를 연관된 엔티티에도 함께 적용하는 것이다. 예) 엔티티를 저장할 때 연관된 엔티티도 함께 저장하고, 엔티티를 삭제할 때 연관된 엔티티도 함께 삭제하는 것
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Entity
@Table(name="membership_card")
public class MembershipCard {
@Id
@Column(name="card_number")
private String number;
@OneToOne(cascade=CascadeType.PERSIST) //MembershipCard 엔티티를 저장할 때 연관된 owner도 함께 저장한다.
@JoinColumn(name="user_email")
private User owner;
//…..
}
User owner = new User("jvm@asda.com", "JVM", new Date());
MembershipCard memberCard = new MembershipCard("1234", owner, new Date());
em.persist(memberCard); //연관된 owner도 영속 객체로 추가함
[CascadeType]
- PERSIST - persist() 실행시 연관된 엔티티를 함께 영속 객체로 추가
- REMOVE - remove() 실행시 연관된 엔티티를 함께 삭제
- DETACH - detach() 실행시 연관된 엔티티를 함께 분리 상태로 만듬
- REFRESH - refresh() 실행시 연관된 엔티티를 함께 다시 읽어옴
- MERGE - merge() 실행시 연관된 엔티티도 함께 관리 상태로 바꿈
- ALL - 모든 상태 변화에 대해 연관된 엔티티에 함께 적용
cascade 속성은 배열을 값으로 갖기 때문에 필요한 전이 대상을 배열로 전달할 수 있다.
02. 영속성 전이 주의 사항
엔티티는 독립적인 라이프사이클을 갖기 때문에 엔티티를 삭제한다고 해서 연관된 엔티티를 함께 삭제하는 경우는 드물다. 보통 엔티티 삭제시 연관된 엔티티는 null로 할당하거나 콜렉션 연관에서 삭제하는 것이 더 일반적인 방법이다.