em.find()
: 데이터베이스를 통해서 실제 엔티티 객체 조회
em.getReference()
: 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회
프록시 객체의 초기화
초기에 프록시 객체는 객체의 껍데기만 갖추고 있다. 프로시 객체에 getter method를 호출하면 영속성 컨텍스트에 초기화 요청을 하게 되는데, 이 때 DB에서 데이터를 조회해 실제 Entity를 생성한다.
em.getReference()
를 호출해도 실제 엔티티를 반환한다.emf.getPersistenceUnitUtil.isLoaded(entity)
entity.getClass()
Hibernate.intialize(entity)
fetch = FetchType.LAZY
지연 로딩 LAZY를 사용하면 해당 컬럼에 해당하는 객체를 프록시로 조회한다. 프록시로 조회된 엔티티는 엔티티를 가져올 때가 아니라 실제 엔티티의 값을 가져올 때 초기화된다.
fetch = FetchType.EAGER
즉시 로딩 EAGER을 사용하면 해당 컬럼에 해당하는 객체를 함께 조회한다. JPA 구현체는 가능하면 조인을 사용해서 SQL 한번에 함께 조회한다.
@ManyToOne
, @OneToOne
은 기본이 즉시 로딩 -> LAZY로 설정특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용한다.
@OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST)
주의할 점
CASCADE의 종류
orphanRemoval = true
(고아 객체 제거) : 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제한다.Parent parent1 = em.find(Parent.class, id);
parent1.getChildren().remove(0); // 자식 엔티티를 컬랙션에서 제거
주의할 점
@OneToOne
, @OneToMany
만 가능CascadeType.REMOVE
처럼 동작CascadeType.ALL
+ orphanRemovel=true
em.persist()
로 영속화, em.remove()
로 제거
좋은 정보 감사합니다