본문 바로가기
DB/SQL

Spring Data JPA 연관관계 매핑 에러

by wonduk 2023. 10. 11.
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