[JPA] JPA 프로그래밍 5. 엔티티 상태와 Cascade

JPA 프로그래밍 5. 엔티티 상태와 Cascade

Cascade : 엔티티의 상태 변화를 전파 시키는 옵션

잠깐! 엔티티의 상태란?

Transient : JPA가 모르는 상태

객세 생성 단계

Account account = new Account();

Persistent : JPA가 관리중인 상태 (1차 캐시, Dirty Checking, Write Behind, …)

@PersistenceContext
EntityManager entityManager;
...생략
Session session = entity Manager.unwrap(Session.class);
session.save(account);

session.save()하면 persist상태

1차캐시

Dirty Checking

account.setUsername("juho");
session.save(account);            // 최초 insert문 발생

account.setUsername("juho2");
session.save(account);            // 변경된 내역 update문 발생 (Dirty checking)

Write Behind

account.setUsername("juho");
session.save(account);    // 최초 insert문 발생

account.setUsername("juho2");
account.setUsername("juho3");
account.setUsername("juho");
session.save(account);    // 3번 변경됐지만 기존 값과 똑같으므로 update문 발생하지 않음 (Write behind)

Detached : JPA가 더이상 관리하지 않는 상태

session.save(account);

return account;        // 리턴된 객체는 더이상 JPA가 관리하지 않음

Removed : JPA가 관리하긴 하지만 삭제하기로 한 상태

트랜잭션 종료시 DB 삭제

https://d.pr/i/12OjLT

Cascade옵션을 쓰면 엔티티 상태의 변화시 자동으로 인지하여 적용해줌

public class Post {
    @Id @GeneratedValue
    Long id;
    private title;
    @OneToMany(mappedBy = "post", cascade = CascadeType.ALL)
    private Set<Comment> comments = new HashSet<>();
}
Post post = new Post();
post.setTitle("새로운 글");

Comment comment01 = new Comment();
comment01.setComment("댓글1");

Comment comment02 = new Comment();
comment02.setComment("댓글2");

session.save(post);            // post만 저장해도 Comment정보가 같이 저장됨.