본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JPA

JPA 공부 5 - 일대일 연관관계(1:1)

반응형

 

일대일 연관관계 단방향(1:1)

 

일대일 관계는 그 반대에서도 일대일이다 .  주 테이블이나 대상 테이블 중에 외래 키 선택이 가능하고  외래 키에 데이터베이스 유니크 제약 조건을 추가하면 된다. 

둘다 동등한 관계이기 떄문에 연관관계의 주인이 없다  어느 쪽에서 외래 키를 관리해도 상관이 없다 .

 

일대일 연관관계

 

 

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Locker {

    @Id @GeneratedValue
    private Long id;
    private String name;
    
    //양방향일 경우 추가 
    //@OneToOne(mappedBy = "locker")
    //private Member member;
}

 

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Entity
public class Member {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "team_id")
    private Team team;


    public void addTeam(Team team) {
        this.setTeam(team);
        team.getMembers().add(this);
    }

    @OneToOne
    @JoinColumn(name = "locker_id")
    private Locker locker;
}

 

member에 @OneToOne 으로 Locker를 가지고 가지고 있고 @JoinColumn으로 locker_id를 외래키로 지정했다.  

 

양방향일 경우 반대편인 Locker에 Member 필드를 추가하고 똑같이 @OneToOne을 지정한다 이떄는 이미 JoinColumn으로 연관관계의 주인을 정해 놨기 때문에 반대편인 Locker에는 mappedBy를 지정해줘야 한다.

 

반대로 Locker 가 member_id를 외래키로 가지고 있어도 문제가 되지 않는다. 

 

-주 테이블에 외래키를 갖고 있으면 

 

 개발에 입장에서 봤을때는  상황에 따라 다르지만  주 테이블을 조회하거나 할 일이 더 많기 떄문에 한번에 데이터를 가져올 수 있는  주테이블 (Member)에 locker가 있는 것이 유리하다 단점으로는 값이 없으면 외래 키가 null이 될 수 있다. 

 

-대상 테이블에 외래키가 있으면

 

반대로 DB 입장에서 봤을 때는  만약 일대일 관계에서  한 회원이 여러개 락커를 갖을수 있는 일대다 관계로 바뀐다 했을때 Locker에 unique 키만 지워주면 되기 때문에 쉽게 일대다 관계로 전환할 수 있다는 장점이 있다.   단점은 반대편 Member 테이블의 Locker 를 조회 할때 외래키가 락커에 있기 떄문에  멤버테이블만 조회해서는 Locker를 알 수 없다 이 경우 확인을 위해 Locker를 뒤져야하기 떄문에  프록싱 기능이 소용이 없다. JPA에서는 이런 경우에는 fetch type을 무조건 EAGAR로 하도록 막아놨다 놨다 어차피 Locker를

찾아야 하니 Lazy 로딩이 필요 없기 떄문이다.

 

 

상황에 맞게 잘사용하면 될 것 같다 . 

반응형