728x90
반응형
SMALL
지난 포스팅에 이어서 이번엔 연관 관계 어노테이션을 알아보겠습니다.
https://jisaydeveloper.tistory.com/38
[Spring Boot] DB관련 어노테이션 (1) - 엔티티
스프링 부트에서 데이터 베이스와 상호 작용하기 위한 다양한 어노테이션들이 제공됩니다. 이번 포스팅에서 어떤 어노테이션이 있고 어떻게 사용하는지 알아보겠습니다. 엔티티 관련 어노테이
jisaydeveloper.tistory.com
연관 관계 어노테이션
- @OneToOne : 일대일 관계를 정의합니다.
주로 한 엔티티가 다른 하나의 엔티티만 관계를 가질 때 사용합니다.
@Entity
public class User {
@OneToOne
private UserProfile userProfile;
}
- @OneToMany 와 @ManyToOne : 일대다, 다대일 관계를 정의합니다.
주로 부모 엔티티가 자식 엔티티를 여러 개 가질 때 사용합니다.
※ fetchType : JPA가 하나의 엔티티를 조회할 때 연관 관계에 있는 객체들을 어떻게 가져올 것이냐를 나타내는 설정
※ cascadeType : 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티를 어떻게 전이할 건지를 나타내는 설정
속성 | 기능 |
fetch = FetchType.EAGER | 연관된 엔티티는 즉시 가져옵니다. 즉, 부모 엔티티가 검색될 때 연관된 엔티티도 함께 가져옵니다. |
fetch = FetchType.LAZY | 연관된 엔티티는 필요할 때 가져옵니다. 즉, 연관된 엔티티가 처음으로 접근될 때 가져옵니다. |
CascadeType.ALL | 모든 Cascade(저장, 삭제, 갱신)를 적용합니다. |
CascadeType.PERSIST | 엔티티를 영속화할 때, 연관된 엔티티도 함께 유지합니다. |
CascadeType.MERGE | 엔티티 상태를 병합할 때, 연관된 엔티티도 모두 병합합니다. |
CascadeType.REMOVE | 엔티티를 제거할 때, 연관된 엔티티도 모두 제거합니다. |
CascadeType.DETACH | 부모 엔티티를 detach() 수행하면, 연관 엔티티도 detach()상태가 되어 변경 사항 반영 하지 않습니다. |
CascadeType.REFRESH | 상위 엔티티를 새로고침할 때, 연관된 엔티티도 모두 새로고침 |
mappedBy | 연관된 엔티티에서 양방향 관계를 설정합니다. 해당 속성을 사용하여 어떤 필드가 역방향 연관을 가리키는지 지정합니다. |
@Entity
public class Order {
@Id
private Long orderNum;
@Column
private String userName;
@ManyToOne(fetch = FetchType.LAZY)
private List<Orderitem> orderItem;
@OneToMany(cascade = CascadeType.ALL)
private List<items> items;
}
- @Transactional : 클래스나 메서드에 트랜잭션을 정의하고, 트랜잭션의 범위 내에서 연관된 엔티티 작업을 합니다.
부모 엔티티와 자식 엔티티 간의 관계에서 연관된 엔티티 작업이 트랜잭션으로 관리됩니다.
@Service
@RequiredArgsConstructor
public class OrderService {
private fianl OrderRepository orderRepository;
@Transactional
public void createOrderWithItems() {
Order order = new Order();
orderRepository.save(order);
OrderItem item1 = new OrderItem();
OrderItem item2 = new OrderItem();
order.addOrderItem(item1);
order.addOrderItem(item2);
}
}
- @ManyToMany : 다대다 관계를 설정합니다.
주로 두 엔티티가 서로를 여러 번 가질 때 사용합니다.
@Entity
public class Student {
@ManyToMany
private Set<Subject> subjects;
}
@Entity
public class Subject {
@ManyToMany(mappedBy = "subjects")
private Set<Student> students;
}
- @JoinColumn : 연관 관계에서 외래 키(foreign key)를 지정합니다.
주로 양방향 괸계에서 사용하며 어느 엔티티가 외래 키를 사용할지 정의합니다.
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
}
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "department")
private List<Employee> employees;
}
- @JoinTable : 다대다 관계의 연결 테이블을 지정합니다.
특히 @ManyToMany 어노테이션과 함께 사용되어 연결 테이블의 이름 및 외래 키를 정의합니다.
@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;
}
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany(mappedBy = "courses") // 양방향 관계 설정
private List<Student> students;
}
728x90
반응형
LIST
'Study' 카테고리의 다른 글
2023 벤처스타트업 SW개발인재 매칭 페스티벌 (0) | 2023.10.26 |
---|---|
[Spring Boot] DB관련 어노테이션 (3) - Spring Data JPA, JPQL (0) | 2023.10.26 |
[Spring Boot] DB관련 어노테이션 (1) - 엔티티 (0) | 2023.10.25 |
프로세스(Process)와 스레드(Thread) (0) | 2023.10.20 |
[DB] RDBMS vs NoSQL (0) | 2023.10.18 |