멤버만 가져오고 싶을 때도 있다.
프록시를 사용하면, 사용될 때 가져온다.
em.find() : 직접 database에 접근해서 data를 가져옴
em.getReference() : proxy를 통해서 가져옴. 가짜 클래스
실제 클래스를 상속받아서 만들어짐
겉모양이 같다
실제 Member를 가져오는 것이 아니라, 가져온 Member를 통해 간접적으로 접근한다.
만약 em.find로 미리 찾아온 Member가 있다면, 굳이 proxy를 생성하지 않고, 영속성 콘텍스트에 올라온 Member를 가져온다
만약 proxy가 만들어 놓은 상태에서, em.clear()를 시키고 나서 proxy를 찾으면 조회가 되지 않는다.
m1 = em.find(member)
m2 = em.getReference(member)
위와 같이 둘다 동시에 찾을 때, m1==m2 가 되도록 하기 위해 움직인다. ( 무슨 소리인지 잘 모르겠다)
지연로딩 LAZY를 사용해서 프록시로 조회
실제 Team을 사용하는 시점에 초기화
---> Member 따로, Team 따로 쿼리가 따로 나간다.
만약에 거의 같이 쓰는 경우에는 EAGER를 써서 함께 쿼리가 나가도록 해야 한다.
@ManyToOne, @OneToOne 은 Default가 EAGER -> LAZY로 바꾸어 주어야 한다.
@OneToMany, @ManyToMany는 기본이 LAZY
em.createQuery("select m from Member m") 에서, Member를 조회할 때 Team 쿼리도 같이 나간다
부모 Entity를 저장할 때, 자식 Entity도 같이 저장할 때 사용
Parent.class
@OneToMany(mappedBy="parent", cascade=CascasType.PERSIST)
private List<Child> childList;
위와 같은 상황일 때, parent를 생성하면 child도 생성된다.
영속성 전이는 연관관계를 Mapping하는 것과 아무 관계가 없다.
엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐 그 이상도, 그 이하도 아니다.
ALL, PERSIST 보통 2개만 사용.
-> PERSIST : 저장할 때만 맞추는 것
Child가 Parent로만 관리되면 상관없는데, Child가 다른 Entity로 관리가 추가로 되면 ,사용하면 안된다. ( 소유자가 하나일 때 )
-> 단일 Entity에 종속적일때만 사용
LifeCycle이 똑같을 때
단일 소유자 일때
만 사용할 것.
부모 Entity와 끊어진 연관관계가 끊어진 자동 Entity를 자동으로 삭제. orphanRemoval = true
Parent.class
@OneToMany(mappedBy="parent", cascade=CascasType.PERSIST,orphanRemoval = true)
private List<Child> childList;
Cascade=CascasType.ALL,orphanRemoval = true
위와 같이 ALL, true를 주게 되면, 부모 Entity를 통해서 자식의 생명주기를 관리할 수 있다.
( 자식의 생성과 삭제, 조회를 모두 부모 Entity를 통해서 할 수 있다. 부모 Entity는 영속성 콘텍스트에 의해, 자식 Entity는 부모에 의해 관리가 될 수 있다. 도메인 주도 설계 (DDD)할 때 유용하다. )
LifeCycle이 똑같을 때
단일 소유자 일때
사용한다.