⏰ 2024. 05. 28 화
✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.
Entity 연관 관계
관계형 데이터베이스에서는 테이블 간의 외래키(Foreign key)로 연관 관계를 맺고, JOIN 문을 통해 테이블을 조회할 수 있다.
JOIN 문을 통해 어느 테이블에서든 양쪽 테이블의 데이터를 조회할 수 있다.
결론
=> 관계형 데이터베이스 테이블 간의 연관 관계에는 방향의 개념이 없다.
그러면 스프링부트 JPA의 Entity를 통해 테이블을 표현하기 때문에 데이터베이스의 테이블 간의 연관 관계를 Entity의 연관 관계
로 표현해야 한다.
@Entity
@Table
public class Entity1 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Entity1 entity1; // #
}
@Entity
@Table
public class Entity2 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Entity2 entity2; // #
}
참조
함으로 써 Entity 간의 연관 관계를 맺을 수 있다.양방향 관계
라고 하고, 한쪽에서만 참조하고 있는 경우를 단방향 관계
라고 한다.1:1 관계
⚡ 외래키 주인 정하기
외래키 주인
만이 외래키를 등록, 수정, 삭제할 수 있으며, 주인이 아닌 쪽은 오직 외래 키를 읽기만 가능하다.@JoinColumn()
: 외래키 주인을 설정하는 애너테이션, 속성(컬럼명, null여부, unique 여부 등)@Entity
@Table(name = "entity1")
public class Entity1 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "entity2_id")
private Entity2 entity2;
}
@Entity
@Table(name = "entity2")
public class Entity2 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
mappedBy
옵션을 사용한다.mappedBy
의 속성 값은 외래키의 주인인 상대 Entity의 @JoinColumn()
으로 설정된 필드명을 넣는다.❗ @JoinColumn()
, mappedBy
둘 다 생략 가능하지만, 의도하지 않은 중간 테이블이 생성되는 경우가 있어 생략하지 않는 편이 좋다.
@Entity
@Table(name = "entity1")
public class Entity1 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "entity2_id")
private Entity2 entity2;
}
@Entity
@Table(name = "entity2")
public class Entity2 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(mappedBy = "entity2")
private Entity1 entity1;
}