본문 바로가기

Spring/JPA

데이터 연관관계

728x90

항해 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; }

```java
=== 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<>();

}

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

JPA_영속성 컨텍스트란?  (0) 2024.04.18
나는 왜 JPA를 사용했을까?  (0) 2024.04.17