SPRING

[Service & MySQL 에러] SQLIntegrityConstraintViolationException

silver-w 2024. 11. 13. 10:59

 

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 설계시 처음부터 참조형으로 만든다면 트랜잭션시 해당 오류가 나올 가능성이 줄어들 것