[TIL] 항해99 Day 41

woonie·2022년 2월 20일
0

TIL

목록 보기
36/64
post-custom-banner

항해 41일차 2022.02.19

1. 데이터 연관관계의 주인

  • 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음

  • 객체 양방향 관계는 A->B, B->A 처럼 참조가 2군데

  • 객체 양방향 관계는 참조가 2군데 있음. 둘중 테이블의 외래 키 를 관리할 곳을 지정해야함

  • 연관관계의 주인: 외래 키를 관리하는 참조

  • 주인의 반대편: 외래 키에 영향을 주지 않음, 단순 조회만 가능

2. 다대일 단방향

  • 다대일의 반대는 일대다
  • A,B 각 엔티티가 있다면 A는 A.b으로 B엔티티를 참조할 수 있지만
    반대로 B에서 A를 참조하는 필드가 없다. 그렇기에 A와 B는 다대일 단방향 연관관계다.
=== A 엔티티 ====
@Entity
public class A {

    @Id
    @GeneratedValue
    @Column(name = "A_ID")
    private Long id;

    private String username;

    @ManyToOne
    @JoinColumn(name = "B_ID")
    private B b;
}
=== B 엔티티 ====
@Entity
public class B {

    @Id
    @GeneratedValue
    @Column(name = "B_ID")
    private Long id;

    private String name;

}
  • @JoinColumn(name = "B_ID")를 사용해서 A.b 필드를 B_ID외래 키와 매핑
    A.b필드로 A테이블의 B_ID 외래키를 관리한다.

3. 다대일 양방향

  • 외래 키가 있는 쪽이 연관관계의 주인
    일대다와 다대일 연관관계는 항상 다(N)에 외래 키가 있다. 여기서는 다쪽인 A 테이블이 외래 키를 가지고 있으므로 A.b가 연관관계의 주인이다.
  • 양쪽을 서로 참조
    어느 한 쪽만 참조하면 양방향 연관관계가 성립하지 않는다.
=== A 엔티티 ====
@Entity
public class test {

    @Id
    @GeneratedValue
    @Column(name = "A_ID")
    private Long id;

    private String username;

    @ManyToOne
    @JoinColumn(name = "B_ID")
    private B b;

    public void setB(B b) {
        this.b = b;
    }
}
=== B 엔티티 ====
@Entity
public class B {

    @Id
    @GeneratedValue
    @Column(name = "B_ID")
    private Long id;

    private String name;

    @OneToMany(mappedBy = "B")
    private List<A> aList = new ArrayList<>();
    
}
profile
동료들과 함께하는 개발의 중요성에 관심이 많습니다. 언제나 호기심을 갖고 꾸준히 노력하는 개발자로서 성장하고 있습니다.
post-custom-banner

0개의 댓글