Home 11. 영속성 전이
Post
Cancel

11. 영속성 전이

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로 할당하거나 콜렉션 연관에서 삭제하는 것이 더 일반적인 방법이다.

This post is licensed under CC BY 4.0 by the author.