상세 컨텐츠

본문 제목

[JPA] @JoinColumn : 외래키 지정에 사용되는 어노테이션, @ManyToOne, @OneToOne, @OneToMany : 관계의 종류

😎 지식/자바_스프링_테스트☕

by :부셔져버린개발자 2025. 1. 10. 17:05

본문

두 엔티티 간의 1 :  1  관계 설정 (@OneToOne)

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

@Entity
public class Profile {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String bio;
    @OneToOne
    @JoinColumn(name = "user_id", nullable =  false, unique = true)  // 외래키 컬럼)
    private User user;
}
더보기

Profile 엔티티의  user_id 컬럼이 User 엔티티의 기본키(id)를  참조한다.

nullable =  false로 설정해 user_id가 반드시 값을 가지도록 강제한다.

unique = true로  설정해 하나의 User만 특정 Profile에 연결될 수 있도록 한다 .

CREATE TABLE profile (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    bio VARCHAR(255),
    user_id BIGINT NOT NULL UNIQUE,
    FOREIGN KEY (user_id) REFERENCES user(id)
);


유저쪽에  명시할 수도  있다

CREATE TABLE user (
    ...
    profile_id ....
    FOREIGN KEY (profile_id)  REFRENCES profile(id)  
);

외래 키로 다른 컬럼을  참조  :   referencedColumnName

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String email; // 외래 키로 참조할 컬럼

    // Getters and Setters
}

@Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToOne
    @JoinColumn(name = "employee_email", referencedColumnName = "email") // 외래 키: employee_email, 참조: Employee.email
    private Employee manager;

    // Getters and Setters
}
더보기

 

name = "employee_email"은 Department 테이블에서 생성될 외래 키 컬럼의 이름이다.

referencedColumnName = "email"은 Employee 테이블의 email 컬럼을 참조하도록 지정한다.

 

CREATE TABLE department (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    employee_email VARCHAR(255),
    FOREIGN KEY (employee_email) REFERENCES employee(email)
);

 


두 엔티티 간의 N :  1  관계 설정 (@ManyToOne)

@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "customer_id", nullable = false) // 외래 키 정의
    private Customer customer; // 하나의 고객은 여러 주문을 가질 수 있음

    private LocalDate orderDate;
}

@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

 

더보기

Order 테이블에는 customer_id라는 외래 키 컬럼이 생성된다.

한 명의 Customer는 여러 개의 Order와 연결될 수 있다.

 

외래키는 다수 쪽  엔티티에 위치한다   

@JoinColumn의 역할: 외래 키 컬럼을 명시한다


두 엔티티 간의 1 : N 관계 설정 (@OneToMany)

@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "customer") // 외래 키 관리: Order 테이블의 customer 필드
    private List<Order> orders = new ArrayList<>(); // Customer는 여러 Order를 가질 수 있음
}

@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "customer_id", nullable = false) // 외래 키 정의
    private Customer customer;

    private LocalDate orderDate;
}
더보기

 

  • 외래 키는 "다수" 쪽에 위치한다.
  • @JoinColumn의 역할: 기본적으로 사용되지 않으며, 대신 mappedBy 속성을 사용하여 외래 키를 관리하는 쪽을 지정한다.

 


두 엔티티 간의 N : M 관계 설정 (@ManyToMany)

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany
    @JoinTable(
        name = "student_course",
        joinColumns = @JoinColumn(name = "student_id"), // 중간 테이블에서 Student의 외래 키
        inverseJoinColumns = @JoinColumn(name = "course_id") // 중간 테이블에서 Course의 외래 키
    )
    private List<Course> courses = new ArrayList<>();
}

@Entity
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(mappedBy = "courses") // 반대쪽에서 매핑됨
    private List<Student> students = new ArrayList<>();
}
더보기

 

외래 키가 중간 테이블에 위치한다.

@JoinTable 사용: 중간 테이블을 명시하기 위해 @JoinTable을 사용한다.

 

중간 테이블 student_course(student_id, course_id)가 생성된다

 

 

728x90

관련글 더보기