Cause: java.sql.SQLIntegrityConstraintViolationException:
Cannot delete or update a parent row: a foreign key constraint fails
(`sakila`.`actor_file`, CONSTRAINT `FK__actor_file_actor` FOREIGN KEY (`actor_id`)
REFERENCES `actor` (`actor_id`))
트랜잭션 처리시, 중간 단계에서 쿼리가 정상적으로 실행되지 않을때 오류,
public void deleteActor(int actorId, String path) {
// 1) filmActor 리스트 삭제 : 없을 수 있음
FilmActor fa = new FilmActor();
fa.setActorId(actorId);
filmActorMapper.delectFilmActor(fa);
// 2) 액터파일 정보 삭제 : 없을 수 있음
List<ActorFile> list = actorFileMapper.selectActorFileListByActor(actorId);
ActorFile onlyActorId = new ActorFile();
onlyActorId.setActorId(actorId);
actorFileMapper.deleteActorFile(onlyActorId); // 해당쿼리가 정상처리가 되지 않아 FK 이슈발생
log.debug("onlyActorId = " + onlyActorId.toString());
// 3) 액터 정보 삭제
int row = actorMapper.deleteActor(actorId);
// 물리적 파일 삭제
if(row == 1 && list != null && list.size() > 0) {
for(ActorFile af : list) {
String fullname = path + af.getFileName() + "." + af.getExt();
File f = new File(fullname);
f.delete();
}
}
위 경우 , 3) 이전 deleteActorFile(onlyActorId)의 쿼리가 정상적으로 처리되지 않아 FK 관련 오류가 났음.
디버그는 마지막단계는 주석처리하고, 중간단계가 제대로 실행되는지 확인 하는 등 하면 된다.
-> deleteActorFile 쿼리에서 각 타입에 맞는 동적쿼리를 설정했는지 등 확인해 볼 것
※ 각 쿼리를 실행하는 메서드의 매개변수가 primity 타입인지 확인 해볼 것
int 타입은 디폴트값은 0 Integer은 null 이므로 동적 where쿼리를 생성할때 if 문에 해당 매개변수가 != null 이라면 int형인 매개변수에 적용되지 않는다.
커맨드 객체 및 vo 설계시 처음부터 참조형으로 만든다면 트랜잭션시 해당 오류가 나올 가능성이 줄어들 것
'SPRING' 카테고리의 다른 글
Filter / Interceptor / AOP (0) | 2024.12.09 |
---|---|
POST-Redirect-GET (PRG) 패턴 (0) | 2024.11.30 |
[java 에러] row cannot be resolved to a variable (0) | 2024.11.13 |
{fn:substring} HTML 에서 글자열 자르기 (0) | 2024.11.12 |
[2024-11-07]쿼리파라미터 전달, DB 기본값 Null (0) | 2024.11.08 |