엔티티를 프록시로 조회할 때, 식별자(PK) 값을 파라미터로 전달하게 된다.
따라서 프록시 객체에서 ‘해당 PK 값을 호출하는 것’으로는 프록시 초기화가 이루어지지 않는다.
// 변수 team에 프록시 객체를 담음
Team team = em.getReference(Team.class, "team1"); // 식별자 보관
team.getId(); //프록시 초기화가 이루어지지 않는다!!!
team.getId() 를 호출한 경우, 프록시 초기화가 이루어지지 않는다.
왜냐하면 식별자는 DB조회 없이도 알 수 있기 때문이다.
프록시는 연관관계를 설정할 때, 유용하게 사용할 수 있다.
Member member = em.find(Member.class, "member1"); //실제 엔티티
Team team = em.getReference(Team.class, "team1"); //프록시 객체
member.setTeam(team); //연관관계 설정
JPA는 연관관계 설정시, 식별자(PK) 값을 외래키로 사용한다.
즉 연관관계 설정에 필요한 값은 식별자 값밖에 없으므로, 프록시 객체를 사용하여 연관관계를 설정할 수 있다.
Persistence.getPersistenceUtil().isLoaded(Object);
JPA 표준 메서드로, 특정 엔티티나 컬렉션 필드가 로드되었는지 확인한다.
지연 로딩된 속성이 초기화되었는지를 알려주며, 초기화를 강제하지는 않는다.
Hibernate.initialize(Object);
Hibernate 전용 메서드로, 전달된 객체(엔티티 또는 컬렉션)를 즉시 초기화한다.
이 메서드는 Hibernate에서만 동작하며, 초기화되지 않은 Lazy 속성을 강제로 초기화한다.
@TransactionalEventListener는 발행한 메소드의 트랜잭션을 잇는다.