코드 저장소.

Jpa - 엔티티 연관관계 본문

웹개발/Jpa

Jpa - 엔티티 연관관계

slown 2024. 5. 25. 22:46


목차

1.JPA의 연관관계

2.1대1관계

3.1대다관계

4.다대다관계

 

 

1.JPA의 연관관계

JPA(Java Persistence API)에서 연관관계는 단방향과 양방향으로 설정할 수 있습니다. 연관관계는 크게 1대1,1대다,다대다의 세 가지 유형으로 나뉘며, 각각을 단방향과 양방향으로 구현할 수 있습니다.

 

2.1대1관계

단방향: 한쪽 엔티티가 다른 한쪽 엔티티를 참조합니다. 예를 들어, UserUserProfile을 참조하지만 UserProfileUser를 참조하지 않습니다.

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

    private String name;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "profile_id")
    private UserProfile userProfile;

    // getters and setters
}

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

    private String address;

    // No reference to User

    // getters and setters
}

 

양방향: 양쪽 엔티티가 서로를 참조합니다. UserUserProfile을 참조하고, UserProfileUser를 참조합니다.

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

    private String name;

    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
    private UserProfile userProfile;

    // getters and setters
}

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

    private String address;

    @OneToOne
    @JoinColumn(name = "user_id")
    private User user;

    // getters and setters
}

 

3.1대다 관계

단방향: 한쪽 엔티티가 여러 다른 엔티티를 참조합니다. 예를 들어, User가 여러 Order를 참조하지만 OrderUser를 참조하지 않습니다.

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

    private String name;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "user_id") // This creates the foreign key column in orders table
    private List<Order> orders = new ArrayList<>();

    // getters and setters
}

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

    private String product;

    // No reference to User

    // getters and setters
}

 

양방향: 양쪽 엔티티가 서로를 참조합니다. User가 여러 Order를 참조하고, OrderUser를 참조합니다.

 

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

    private String name;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Order> orders = new ArrayList<>();

    // getters and setters
}

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

    private String product;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

    // getters and setters
}

 

4.다대다관계

단방향: 한쪽 엔티티가 여러 다른 엔티티를 참조합니다. 예를 들어, Student가 여러 Course를 참조하지만 Course는 Student를 참조하지 않습니다.

@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 = new ArrayList<>();

    // getters and setters
}

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

    private String title;

    // No reference to Student

    // getters and setters
}

 

양방향: 양쪽 엔티티가 서로를 참조합니다. Student가 여러 Course를 참조하고, Course도 여러 Student를 참조합니다.

@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 = new ArrayList<>();

    // getters and setters
}

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

    private String title;

    @ManyToMany(mappedBy = "courses")
    private List<Student> students = new ArrayList<>();

    // getters and setters
}

 

'웹개발 > Jpa' 카테고리의 다른 글

Jpa - 프록시 및 로딩전략  (0) 2024.05.29
Jpa - 값타입  (0) 2024.05.28
Jpa - 영속성 컨텍스트  (0) 2024.05.13
Jpa [엔티티 매핑]  (0) 2024.05.11
Jpa 란 무엇인가??  (0) 2024.05.07