JPA

JPA 연관관계 매핑 (One to Many,Many to Many)

차간단 2024. 2. 23. 10:50
반응형

객체의 참조와 테이블의 외래 키를 매핑

 

- 방향(Direction): 단방향, 양방향

- 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 이해

- 연관관계의 주인(Owner): 객체 양방향 연관관계는 관리 주인 이 필요

 

  1. 일대일(One-to-One) 관계:
    • 각 행이 다른 테이블의 행과 하나의 관계를 가지는 것입니다.
    • 예를 들어, 사람(Person)과 주민등록번호(Card)가 일대일 관계일 수 있습니다. 각 사람은 하나의 주민등록번호를 갖고, 각 주민등록번호는 한 사람에게만 속할 수 있습니다.
  2. 일대다(One-to-Many) 관계:
    • 한 테이블의 행이 다른 테이블의 여러 행과 관계를 가지는 것입니다.
    • 예를 들어, 부서(Department)와 직원(Employee)가 일대다 관계일 수 있습니다. 각 부서는 여러 명의 직원을 가질 수 있지만, 각 직원은 하나의 부서에만 속할 수 있습니다.
  3. 다대일(Many-to-One) 관계:
    • 다른 테이블의 여러 행이 한 테이블의 행과 관계를 가지는 것입니다.
    • 일대다 관계의 반대입니다.
    • 예를 들어, 여러 명의 직원(Employee)이 하나의 부서(Department)에 속할 수 있습니다.
  4. 다대다(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 속성에 해당 필드를 지정했습니다.

반응형