[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차캐시
- save()한다고 바로 DB에 저장하지 않음
- 저장하기까지(트랜잭션 종료시) 하이버네이트가 캐싱하여 관리
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 삭제
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정보가 같이 저장됨.