728x90
Spring Data JPA를 사용해서 @ManyToOne 매핑을 사용하던여 수정, 삭제를 구현하던 중
could not execute statement [Cannot delete or update a parent row:
a foreign key constraint fails (`shop`.`cart_item`, CONSTRAINT
`FK1uobyhgl1wvgt1jpccia8xxs3` FOREIGN KEY (`cart_id`) REFERENCES `cart` (`cart_id`))]
[delete from cart where cart_id=?]; SQL [delete from cart where cart_id=?];
constraint [null]
이라는 에러문구를 만났다.
에러문구를 해석하면 외래키 제약조건으로 발생한문제로
cart 테이블에서 특정행을 삭제할려고 할 때 cart_item 테이블은 cart의 cart_id를 참조하는 행이 있어서
삭제를 할수가 없다는 문구이다.
JPA에서 외래키 관계와 관련된 제약조건 처리하는 방법으로는
@OneToMany, @OneToOne 관계에 대해서 CascadeType.ALL 속성을 추가하여 연관된 엔티티를 자동으로 삭제하는 방법이 있다.
하지만 제가 쓴 코드의 경우에는 1:n 관계에서 n의 요소 중 1개만 삭제를 하고 수정도 하길 원했다.
CasCadeType.ALL을 준 경우에는 1:n에서 n의 요소를 삭제하게 될 경우 1의 해당하는 테이블도 삭제가 되어 n의 다른 삭제가 안 될 부분들도 같이 삭제가되는 현상이 생겨났다.
그리하여 CascadeType을 PERSIST로 변경하여서 외래키 제약조건을 어기지 않고 수정,삭제를 구현할 수 있었다.
//장바구니와 상품 = 1:n 관계
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST )
@JoinColumn(name="cart_id")
private Cart cart;
이렇게 외래키 제약조건을 변경해주었다.
728x90
'DB > SQL' 카테고리의 다른 글
| [Oracle] 17002 에러, 계정 로그인 권한 에러 (0) | 2023.07.19 |
|---|---|
| SQL DATE연산자 (0) | 2023.06.28 |
| SQL 집계함수(sum,avg,min ....) (0) | 2023.06.28 |
| SQL decode를 이용하여 출력하기 (0) | 2023.06.28 |
| SQL DML,DDL 연습 문제 (0) | 2023.06.28 |