728x90
JPA에서는 테이블의 연관관계를 엔티티 간의 연관관계로 표현할 수 있다.
연관관계 매핑 종류
One To One (일대일)
@JoinColumn으로 외래키 이름을 설정해준다.
@JoinColumn(name = "외래키 이름")
ex) 사용자(User)와 프로필(Profile)은 1:1 관계
@Entity
public class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
@JoinColumn(name = "profile_id") // 외래 키 설정
private Profile profile;
}
One To Many (일대다)
@OneToMany를 사용해준다.
@OneToMany(mappedBy = "변수 이름")
ex) 한 명의 사용자는 여러 개의 게시글(Post)를 가질 수 있다 => 1:N
@OneToMany(mappedBy = "user") => Post 엔티티의 user 필드에 의해 매핑됨
사용자 엔티티 (User)
@Entity
public class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// 여기서 mappedBy 에 들어갈 변수 이름은 연결될 엔티티의 변수여야 한다.
@OneToMany(mappedBy = "user")
private List<Post> posts;
}
Many To One (다대일)
연결할 엔티티에 @ManyToOne 을 붙여주고, @JoinColumn으로 외래키 이름을 설정해준다.
@ManyToOne 이 달려있는 변수 이름이 @OneToMany 의 mappedBy 변수 이름과 같아야 한다.
ex) 한 명의 사용자는 여러 개의 게시글(Post)를 가질 수 있다 => 1:N
게시글 엔티티 (Post)
@Entity
public class Post {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@ManyToOne
@JoinColumn(name = "user_id") // 외래 키 설정
private User user; // 여기에 있는 변수 이름이 mappedBy에 들어갈 변수 이름과 같아야 한다.
}
Many To Many (다대다)
중간 테이블(엔티티)을 하나 생성해준다.
ex) 학생(Student)과 상품(Product)는 N:N 관계
(한 명의 학생이 여러 상품을 구매할 수 있고, 한 상품을 여러 학생이 구매할 수 있다.)
구매 엔티티를 하나 생성한다.
상품 1 : N 구매 M : 1 학생
상품 엔티티 (Product)
@Getter
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long idx;
private String name;
private String description;
private int price;
@OneToMany(mappedBy ="product")
private List<Purchase> purchasList;
}
구매 엔티티 (Purchase)
필드로 idx만 놓고 상품(Product)과 학생(Student)을 다대일로 연결해준다.
@Entity
public class Purchase {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long idx;
@ManyToOne()
@JoinColumn(name="product_idx")
private Product product;
@ManyToOne()
@JoinColumn(name="student_idx")
private Student student;
}
학생 엔티티 (Student)
@Getter
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long idx;
private String name;
private int age;
@OneToMany(mappedBy ="student")
private List<Purchase> purchasList;
}
728x90
'BE > Spring Boot' 카테고리의 다른 글
[Spring Boot] Spring Security란? / 인증(Authentication) 수행 과정 (0) | 2025.02.10 |
---|---|
[Java] Lombok이란? / 주요 어노테이션 정리 (0) | 2025.02.10 |
[Spring Boot] DTO 생성 방법 (단일 파일, 이너 클래스) / 생성 시 주의사항 (0) | 2025.02.10 |
[Spring Boot] Repository 메서드 생성 규칙 (findAll, findBy) (0) | 2025.02.07 |
[Spring Boot] JPA란? / JPA 구성 요소(Entity, Repository) / JPA로 DB 다루기 (1) | 2025.02.06 |