일 대 다 관계의 단방향 매핑 후 save시 insert문과 update문이 추가로 나가는 이슈에 대해 정리한 글입니다.
이슈 상황
- Reservation.class
@Entity
public class Reservation {
// 생략
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "RESERVATIONS_ID")
private List<Seat> seats = new ArrayList<>();
// 생략
}
- Seat.class
@Entity
public class Seat {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "SEATS_ID")
private Long id;
// 생략
}
예매와 좌석의 관계는 1 : N 관계이므로 @OneToMany 를 설정하고 단방향으로 설계하고 예매 정보를 insert 하고 좌석 정보도 insert 하면 의도치 않게 update 문이 추가로 나가게 되었다.
발생 이유
update 문이 나가는 이유는 @OneToMany 의 단방향 설정 때문이다.
Reservation 테이블에는 Seat 외래키가 포함 되어 있지만 Seat 테이블은 Reservation 테이블에 대해는 모른다.
Seat 정보가 먼저 Insert 되고 Reservation 정보도 Insert 된다음 Seat의 외래키를 업데이트 해야 하므로 update문이 나가게 되었다.
해결방법
단방향에서 양방향으로 바꿔야 한다.
객체 지향 프로그래밍에선 양방향의 의존보단 단방향이 좋다라는 말을 들어본적이 있을 것이다.
하지만 현재 상황에선 예매 정보를 저장 시 에 매번 update문이 발생 할 것이다.
매번 update문이 발생하는 것과 양방향으로 설계 하는 것에 대해 트레이드 오프로 설계를 진행 해야 한다.
- Reservation.class
@Entity
public class Reservation {
// 생략
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "RESERVATIONS_ID")
private List<Seat> seats = new ArrayList<>();
// 생략
}
- Seat.class
@Entity
public class Seat {
// 생략
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "RESERVATIONS_ID")
private Reservation reservation;
}
쿼리 결과
'JPA' 카테고리의 다른 글
[JPA] JPQL에서 limit절을 사용해보자 (0) | 2023.01.10 |
---|---|
[Jpa] 테스트는 어느 부분까지 해야할까? (0) | 2022.08.26 |
[Jpa] 단일 테이블 전략의 상속 관계 매핑 이슈 (0) | 2022.08.20 |
[Jpa] 대댓글 계층구조 연관관계 메소드 이슈 (0) | 2022.08.12 |
[Jpa] Cascade (0) | 2022.08.07 |
[Jpa] Transaction Propagation (0) | 2022.08.06 |
[Jpa] Transaction Scope and Isolation (0) | 2022.08.05 |
[Jpa] Deprecated 된 getById() 대안 getReferenceById() (0) | 2022.08.02 |