프록시
- em.find() : DB를 통한 실제 엔티티 객체 조회
- em.getReference() : DB조회를 미룬 가짜(프록시) 엔티티 객체 조회
- 사용되는 시점에 조회함
프록시 특징
- 실제 클래스를 상속받아 만들어진다. 프록시 객체를 통해 실제 객체에 접근하는 것이다.
- 처음 사용시 한번만 초기화한다.
즉시로딩과 지연로딩
- 지연로딩 : 프록시로 조회 LAZY
- 즉시로딩 EAGER
- Member와 Team을 보통 동시에 사용한다면 사용한다.
- 프록시를 사용하지 않는다.
즉시로딩 주의
- 가급적 지연로딩만 사용한다(특히 실무에서)
- 즉시로딩은 N+1 문제를 일으킨다.
- OneToMany, ManyToMany은 default가 LAZY이다.
- ManyToOne, OneToOne은 default가 즉시로딩이다. → LAZY로 설정하자
영속성 전이(CASCADE)와 고아 객체
영속성 전이
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속상태로 만들고 싶을 때
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
em.persist(parent); // child까지 한번에 추가
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> childs = new ArrayList<>();
고아 객체 orphanRemoval = true : 게시판의 첨부파일
고아객체 제거 : 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 제거
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> childs = new ArrayList<>();
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
em.persist(parent); // child까지 한번에 추가
em.flush();
em.clear();
Parent findParent = em.find(Parent.class, parent.getId());
findParent.getChilds().remove(0);
- 참조하는 곳이 하나일 때 사용
- 특정 엔티티가 개인 소유할 때 사용
- 게시판의 첨부파일
'공부 > Spring' 카테고리의 다른 글
[JPA] 쿼리 문법 (0) | 2022.07.18 |
---|---|
[JPA] 값 타입 (0) | 2022.07.02 |
[JPA] 다양한 연관관계 매핑 (0) | 2022.07.02 |
[JPA] 연관관계 매핑 기초 (0) | 2022.07.02 |
[JPA] 엔티티 매핑 (0) | 2022.07.02 |
댓글