Spring Boot 및 JPA(Java Persistence API)를 사용하여 애플리케이션을 구축할 때 엔터티 간의 관계를 관리하는 것이 중요합니다. 이러한 관계를 효과적으로 매핑하는 방법을 이해하면 데이터를 정확하게 모델링하고 효율적인 쿼리를 수행하는 데 도움이 됩니다. 이 가이드에서는 Spring Boot에서 지원하는 다양한 유형의 JPA 매핑(일대일, 일대다, 다대일, 다대다)을 살펴보겠습니다. 단방향 및 양방향 매핑에 대한 예를 제공합니다.
단방향 일대일 관계에서는 한 엔터티가 다른 엔터티를 참조하지만 두 번째 엔터티는 첫 번째 엔터티에 대해 알지 못합니다.
예:
// User.java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToOne; @Data @Entity public class User { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String username; @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "fk_profile_id", referencedColumnName = "id") private Profile profile; } // Profile.java import javax.persistence.Entity; import javax.persistence.Id; @Data @Entity public class Profile { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String bio; }
양방향 일대일 관계에서는 두 엔터티가 서로를 참조합니다.
예:
// User.java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToOne; @Data @Entity public class User { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String username; @OneToOne(mappedBy = "user", cascade = CascadeType.ALL) private Profile profile; } // Profile.java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.JoinColumn; @Data @Entity public class Profile { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String bio; @OneToOne @JoinColumn(name = "user_id") private User user; }
단방향 일대다 관계에서는 한 엔터티가 다른 엔터티의 컬렉션을 참조합니다.
예:
// Author.java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToMany; import java.util.List; @Entity @Data public class Author { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String name; @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "fk_book_id", referencedColumnName = "id") private List<Book> books; } // Book.java import javax.persistence.Entity; import javax.persistence.Id; @Entity @Data public class Book { @Id private Long id; private String title; }
양방향 일대다 관계에서는 두 엔터티가 서로 참조됩니다.
예:
// Author.java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.CascadeType; import javax.persistence.FetchType; import java.util.List; @Entity @Data public class Author { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String name; @OneToMany(mappedBy = "author", cascade = CascadeType.ALL, fetch = FetchType.EAGER) private List<Book> books; } // Book.java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne; @Entity @Data public class Book { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String title; @ManyToOne(name = "fk_author_id", referencedColumnName = "id") private Author author; }
단방향 다대일 관계에서는 여러 엔터티가 단일 엔터티를 참조합니다.
예:
// Order.java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne; @Entity @Data public class Order { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String description; @ManyToOne private Customer customer; } // Customer.java import javax.persistence.Entity; import javax.persistence.Id; @Entity @Data public class Customer { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String name; }
양방향 다대일 관계에서 참조 엔터티에는 참조 엔터티 컬렉션이 있습니다.
예:
// Order.java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne; @Entity @Data public class Order { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String description; @ManyToOne private Customer customer; } // Customer.java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToMany; import java.util.List; @Entity @Data public class Customer { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String name; @OneToMany(mappedBy = "customer") private List<Order> orders; }
단방향 다대다 관계에서는 각 엔터티가 다른 엔터티의 컬렉션을 가지지만 관계는 양쪽에서 명시적으로 관리되지 않습니다.
예:
// Student.java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToMany; import java.util.Set; @Entity @Data public class Student { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String name; @ManyToMany private Set<Course> courses; } // Course.java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToMany; import java.util.Set; @Entity @Data public class Course { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String title; @ManyToMany private Set<Student> students; }
양방향 다대다 관계에서는 두 엔터티가 서로를 참조하며 관계가 명시적으로 관리됩니다.
예:
// Student.java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToMany; import java.util.Set; @Entity @Data public class Student { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String name; @ManyToMany(mappedBy = "students") private Set<Course> courses; } // Course.java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToMany; import java.util.Set; @Entity @Data public class Course { @Id @GeneratedValue(stratergy = GenerationType.Identity) private Long id; private String title; @ManyToMany private Set<Student> students; }
위 내용은 Spring Boot의 JPA 매핑 이해: 일대일, 일대다, 다대일, 다대다 관계의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!