JPA를 쓰면 엔터티 클래스를 정의하게 되고 hibernate는 엔터티 클래스를 바탕으로 DDL을 사용하여 데이터베이스에 자동으로 테이블을 만든다.
cardioEx의 엔터티 클래스를 보면 workout 엔터티의 Id가 외래키로 설정되어 있음 알 수 있다.
그러면 workout 테이블에서 cardioEx가 있는 레코드를 삭제하면 어떻게 될까?
Error synchronizing data with database
Reason:
SQL Error [1451] [23000]: Cannot delete or update a parent row: a foreign key constraint fails (`todayex`.`cardio_ex`, CONSTRAINT `FK9ot1p6mywqrojfauvwjaaqwb` FOREIGN KEY (`workout_id`) REFERENCES `workout` (`idx`))
에러가 뜬다. 왜 그럴까?
JPA는 외래키 설정시 기본적으로 삭제 조건 명시하지 않으면 NO ACTION이나 RESTRICT가 적용된다.
정말일까?
On Delete나 On Update시 Restrict로 되어 있음을 볼 수 있다.
이제 이것을 변경하면 된다. 물론 경우의 따라서 다르다. 이번 프로젝트의 경우 workout 데이터를 삭제시에 해당 cardioEx데이터를 삭제하는게 맞다고 판단했기에 castcade로 바꾸는 것이다.
바꾼 후 세이브를 클릭하고 workout 테이블에서 레코드를 삭제하면 에러 없이 삭제됨을 볼 수 있다.
오늘 배운 것들
데이터 삭제나 업데이트 시 어떻게 할지도 정하는 것도 매우 중요함을 배웠다. 만약 내가 restrict 상태에서 이 서비스를 배포했다면, workout 삭제가 안되서 매우 어처구니 없는 상황을 맞이했을 것이다.. ㅎㄷㄷ..
참고 자료
https://www.youtube.com/watch?v=c8WNbcxkRhY&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=3