객체의 참조와 테이블의 외래 키를 매핑
- 방향(Direction): 단방향, 양방향
- 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 이해
- 연관관계의 주인(Owner): 객체 양방향 연관관계는 관리 주인 이 필요
- 일대일(One-to-One) 관계:
- 각 행이 다른 테이블의 행과 하나의 관계를 가지는 것입니다.
- 예를 들어, 사람(Person)과 주민등록번호(Card)가 일대일 관계일 수 있습니다. 각 사람은 하나의 주민등록번호를 갖고, 각 주민등록번호는 한 사람에게만 속할 수 있습니다.
- 일대다(One-to-Many) 관계:
- 한 테이블의 행이 다른 테이블의 여러 행과 관계를 가지는 것입니다.
- 예를 들어, 부서(Department)와 직원(Employee)가 일대다 관계일 수 있습니다. 각 부서는 여러 명의 직원을 가질 수 있지만, 각 직원은 하나의 부서에만 속할 수 있습니다.
- 다대일(Many-to-One) 관계:
- 다른 테이블의 여러 행이 한 테이블의 행과 관계를 가지는 것입니다.
- 일대다 관계의 반대입니다.
- 예를 들어, 여러 명의 직원(Employee)이 하나의 부서(Department)에 속할 수 있습니다.
- 다대다(Many-to-Many) 관계:
- 두 테이블 간에 서로 다대다 관계를 가집니다.
- 예를 들어, 학생(Student)과 강의(Course)가 다대다 관계일 수 있습니다. 각 학생은 여러 개의 강의를 수강할 수 있고, 각 강의도 여러 명의 학생이 수강할 수 있습니다.
이러한 관계들을 설계할 때, 외래 키(Foreign Key) 제약조건과 인덱스(Index)를 적절하게 사용하여 데이터 무결성을 유지하는 것이 중요합니다.
일대다 관계 (One To Many)
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
private List<Employee> employees;
// constructors, getters, setters, etc.
}
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// constructors, getters, setters, etc.
}
위 코드에서 Department와 Employee라는 두 개의 엔티티가 있습니다. Department 엔티티는 여러 개의 Employee 엔티티와 관계를 맺고 있으며,
@OneToMany 어노테이션을 사용하여 표현됩니다. Employee 엔티티는 하나의 Department 엔티티와 관계를 맺고 있으며, 이는 @ManyToOne 어노테이션을 사용하여 표현됩니다.
또한 mappedBy 속성은 Department 엔티티의 employees 필드에서 연관관계의 주인이 되는 필드를 지정합니다.
여기서는 Employee 엔티티의 department 필드가 연관관계의 주인이므로 mappedBy 속성에 해당 필드를 지정했습니다.
마지막으로 @JoinColumn 어노테이션을 사용하여 외래 키의 이름을 지정합니다.
일대일 관계 (One to One)
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(mappedBy = "person", cascade = CascadeType.ALL)
private Card card;
// constructors, getters, setters, etc.
}
@Entity
public class Card {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String number;
@OneToOne
@JoinColumn(name = "person_id")
private Person person;
// constructors, getters, setters, etc.
}
예를 들어, 사람(Person)과 주민등록번호(Card)라는 엔티티가 있고, 각 사람은 하나의 주민등록번호를 갖는 일대일 관계를 가진다고 가정해 보겠습니다.
위 코드에서 Person과 Card라는 두 개의 엔티티가 있습니다. Person은 하나의 Card를 가지며, Card는 하나의 Person과 연결됩니다.
Person 엔티티에서는 @OneToOne 어노테이션을 사용하여 Card 엔티티와의 일대일 관계를 표현합니다. mappedBy 속성을 사용하여 Card 엔티티에서 관계의 주인을 지정합니다.
Card 엔티티에서는 @OneToOne 어노테이션을 사용하여 Person 엔티티와의 일대일 관계를 표현합니다. @JoinColumn 어노테이션을 사용하여 외래 키의 이름을 지정합니다.
다대일 관계 (Many To One)
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
private List<Employee> employees;
// constructors, getters, setters, etc.
}
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// constructors, getters, setters, etc.
}
예를 들어, 부서(Department)와 직원(Employee)라는 엔티티가 있고, 하나의 부서는 여러 명의 직원을 가질 수 있는 다대일 관계를 가진다고 가정해 보겠습니다.
위 코드에서 Department와 Employee라는 두 개의 엔티티가 있습니다. Department는 여러 명의 Employee와 관계를 맺고 있으며, 이는 @OneToMany 어노테이션을 사용하여 표현됩니다. Employee는 하나의 Department와 관계를 맺고 있으며, 이는 @ManyToOne 어노테이션을 사용하여 표현됩니다.
@JoinColumn 어노테이션을 사용하여 외래 키의 이름을 지정합니다. 여기서는 Employee 엔티티의 department 필드가 외래 키를 가지며, 이를 department_id라는 이름의 외래 키로 지정했습니다.
이렇게 매핑된 엔티티들은 JPA의 영속성 컨텍스트를 통해 관리되며, 데이터베이스의 테이블 간에는 적절한 외래 키 관계가 생성됩니다.
다대다 관계 (Many To Many)
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private List<Course> courses;
// constructors, getters, setters, etc.
}
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany(mappedBy = "courses")
private List<Student> students;
// constructors, getters, setters, etc.
}
예를 들어, 학생(Student)과 강의(Course)라는 엔티티가 있고, 한 명의 학생은 여러 개의 강의를 수강할 수 있으며, 각 강의는 여러 명의 학생들에게 수강될 수 있는 다대다 관계를 가진다고 가정해 보겠습니다.
위 코드에서 Student와 Course라는 두 개의 엔티티가 있습니다. Student는 여러 개의 Course와 관계를 맺고 있으며, 이는 @ManyToMany 어노테이션을 사용하여 표현됩니다. Course는 여러 명의 Student와 관계를 맺고 있으며, 이 또한 @ManyToMany 어노테이션을 사용하여 표현됩니다.
다대다 관계를 매핑하기 위해서는 연결 테이블이 필요합니다. @JoinTable 어노테이션을 사용하여 연결 테이블을 지정할 수 있습니다. 여기서는 student_course라는 이름의 연결 테이블을 생성하였습니다. joinColumns 속성은 Student 엔티티와 연결될 외래 키 컬럼을 지정하고, inverseJoinColumns 속성은 Course 엔티티와 연결될 외래 키 컬럼을 지정합니다.
mappedBy 속성은 양방향 관계에서 역방향 관계의 주인을 지정합니다. 여기서는 Course 엔티티의 students 필드가 연관관계의 주인이므로 mappedBy 속성에 해당 필드를 지정했습니다.
'JPA' 카테고리의 다른 글
JPA 연관관계 다대일, 일대다, 일대일, 다대다 (0) | 2024.03.04 |
---|---|
JPA 기본 키 매핑(Entity Mapping) GenerationType.IDENTITY, SEQUENCE, TABLE (0) | 2024.02.22 |
JPA hibernate.hbm2ddl.auto 매핑 어노테이션(mapping annotations) (0) | 2024.02.22 |
JPA hibernate.hbm2ddl.auto 데이터베이스 스키마 자동생성 (0) | 2024.02.21 |
JPA 플러시(flush) (1) | 2024.02.21 |