Spring/JPA
데이터 연관관계
nanoh
2024. 4. 15. 08:58
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<>();
}