JVM/JPA

@OneToOne

kyoulho 2023. 6. 16. 16:02

일대일 관계를 나타내는 데 사용한다.

 

속성 기능 기본값
mappedBy 엔티티의 PK가 FK로 사용되고 있는 테이블의 필드명을 지정한다.
연관관계의 주인이 아니라는 설정이기도 하다..
 

 

양방향 예제 코드

@Entity
public class Member {
    @Id
    @GeneratedValue()
    @Column(name = "MEMBER_ID")
    private String id;
    @OneToOne(mappedBy = "member")
    private Locker locker;

}

@Entity
class Locker {
    @Id
    @GeneratedValue()
    @Column(name = "LOCKER_ID")
    private String id;
    @OneToOne
    @JoinColumn(name = "MEMBER_ID")
    private Member member;
}

 

주의

일대일 관계에서 지연 로딩의 발동 조건이 있다.

1. nullable이 허용되지 않는 1:1 관계. 즉, 참조 객체가 optional = false로 지정할 수 있는 관계여야 한다.

2. 양방향이 아닌 단방향 1:1 관계여야 한다.

3. @PrimaryKeyJoin은 허용되지 않는다. 부모와 자식 엔티티간의 조인칼럼이 모두 PK의 경우를 의미한다.

 

정리하자면 일대일 양방향 관계에서 연관관계의 주인이 아닌 곳에서 조회시 지연 로딩이 동작하지 않는다는 것이다.

 

 JPA의 지연로딩은 연관관계 엔티티에 null 혹은 프록시를 집어넣어서 동작하는데 연관관계의 주인이 아닌 쪽 테이블에서는 FK가 없어 주인의 상태를 확인할 수 없기에 null을 넣을지 프록시를 넣을지 확신할 수 없다. 때문에 주인의 존재 여부를 확인하는 쿼리를 실행한다. (프록시를 넣어 뒀다가 null을 반환할 수는 없다.)

 테이블 관점으로 보자면 LOCKER 테이블에서는 MEMBER_ID 라는 컬럼을 통해 Member의 존재를 확인할 수 있지만 MEMBER 테이블에서는 Locker의 존재를 확인할 수 없다.

 

@OneToMany에서는 지연로딩이 가능한데 이때는 무조건 프록시 객체를 만들어놓고 이후 조회시 데이터가 없으면 빈 컬렉션을 리턴할 수 있기 때문이다.

'JVM > JPA' 카테고리의 다른 글

복합키 매핑 @IdClass, @EmbeddedId  (0) 2023.06.16
@ManyToMany  (0) 2023.06.16
@OneToMany  (0) 2023.06.12
@ManyToOne, @JoinColumn  (0) 2023.06.12
@Access  (0) 2023.06.11