[JPA] @JoinColumn : 외래키 지정에 사용되는 어노테이션, @ManyToOne, @OneToOne, @OneToMany : 관계의 종류
@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)
);
@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)
);
@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의 역할: 외래 키 컬럼을 명시한다
@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;
}
@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)가 생성된다
[JPA] JPA N+1 문제와 해결 방안 (3) | 2025.01.10 |
---|---|
[테스트] 성능테스트(부하테스트) : JMeter, Artillery, Gatling (0) | 2025.01.10 |
[인프런강의] 백엔드 애플리케이션 성능 테스트하기 (0) | 2025.01.08 |
[스프링] Spring AOP 와 동작 원리 (0) | 2025.01.03 |
[JAVA] Random vs SecureRandom vs ThreadLocalRandom (1) | 2024.12.26 |