em.find()
: 데이터베이스를 통해서 실제 엔티티 객체 조회em.getReference()
: 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회, DB에 쿼리가 나가지 않는데 객체가 조회 됨Member member = em.getReference(Member.class, “id”);
// 프록시 객체를 가져옴
member.getName();
// target의 값이 없으면, JPA가 영속성 컨텍스트에 초기화를 요청
// 영속성 컨텍스트가 DB를 조회하고, 실제 엔티티를 생성해서 줌
// target과 실제 엔티티를 연결후 getName() 값 가져옴
@ManyToOne(fetch = FetchType.LAZY)
Member member = em.find(Member.class, 1L);//Team은 프록시로 조회
Team team = member.getTeam(); //이때 쿼리가 나가지는 않음(프록시를 가져오기 때문에)
team.getName();
// 실제 team을 사용하는 시점에 DB 초기화(DB 쿼리 나감)
// 프록시를 가져와서 실제 어떤 메서드를 사용할 때
@ManyToOne(fetch = FetchType.EAGER)
Member member = em.find(Member.class, 1L);
//Member와 Team을 한번에 조회 (프록시 X)
@ManyToOne
, @OneToOne
은 기본이 즉시 로딩 > LAZY로 설정@OneToMany
, @ManyToMany
는 기본이 지연 로딩public class class Parent{
...
@OneToMany(mappedBy="parent", cascade=CascadeType.ALL)
// Parent를 persist 할 때 컬렉션 안에 있는 것들에도 다 persist를 날려주겠다!
private List<Child> childList = new ArrayList<>();
...
}
옵션
orphanRemoval = true
옵션@OneToOne
, @OneToMany
만 가능