해결된 질문
작성
·
45
0
테스트코드 작성하는 강의를 막 마치고, html '/test' 생성하여 확인하는 강의를 진입하여 듣던중,
test만 돌리다 오랜만에 datainitilizer가 불리도록 run을 하니,
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataInitializer': Invocation of init method failed
Caused by: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation : com.mkim.portfolio.domain.entity.ProjectSkill.skill -> com.mkim.portfolio.domain.entity.Skill
이런 에러가 발생하였습니다.
테스트코드 작성 강의전에는 정상적으로 datainitializer 호출되었고, 테스트 케이스도 전부 패스한 상황이라 무엇이 문제인가 계속 확인을 하는데 이해한 바로는 ProjectSkill이 Skill 엔티티를 참조해야하지만 아직 생성이 안된 상태라 발생하는것처럼 이해하였는데,
val java = Skill(name = "Java", type = SkillType.LANGUAGE.name, isActive = true)
val kotlin = Skill(name = "Kotlin", type = SkillType.LANGUAGE.name, isActive = true)
val python = Skill(name = "Python", type = SkillType.LANGUAGE.name, isActive = true)
val spring = Skill(name = "Spring", type = SkillType.FRAMEWORK.name, isActive = true)
.
.
.
skillRepository.saveAll(
mutableListOf(
java,
kotlin,
spring,
.
.
.
)
.
...
.....
project1.skills.addAll(
mutableListOf(
ProjectSkill(project = project1, skill = java),
ProjectSkill(project = project1, skill = spring),
ProjectSkill(project = project1, skill = mysql),
ProjectSkill(project = project1, skill = redis)
)
)
이렇게 작성하여 부르면 에러가 나지만
val skills = mutableListOf(
Skill(name = "Java", type = SkillType.LANGUAGE.name, isActive = true),
Skill(name = "Kotlin", type = SkillType.LANGUAGE.name, isActive = true),
Skill(name = "Python", type = SkillType.LANGUAGE.name, isActive = true),
Skill(name = "Spring", type = SkillType.FRAMEWORK.name, isActive = true),
Skill(name = "Django", type = SkillType.FRAMEWORK.name, isActive = true),
Skill(name = "MySQL", type = SkillType.DATABASE.name, isActive = true),
Skill(name = "Redis", type = SkillType.DATABASE.name, isActive = true),
Skill(name = "Kafka", type = SkillType.TOOL.name, isActive = true)
)
skillRepository.saveAll(skills)
.
...
.....
project1.skills.addAll(
mutableListOf(
ProjectSkill(project = project1, skill = skills[0]), // Java
ProjectSkill(project = project1, skill = skills[3]), // Spring
ProjectSkill(project = project1, skill = skills[5]), // MySQL
ProjectSkill(project = project1, skill = skills[6]) // Redis
)
)
이와 같이하면 에러가 살아집니다...
무엇이 달라 차이를 만드는지가 너무 궁금하여 질문 남겨요
감사합니다,
전체 현재까지 코드 깃허브
답변 1
0
안녕하세요 정보근입니다:)
오류가 난다는 소스 코드 살펴보니
skillRepository.saveAll() 메소드에서 python이 누락되어 있네요.
Skill 테이블에 python 엔티티가 저장되어 있지 않은데(또는 영속 상태가 되지 않았는데),
Project와 Skill을 연결하는 ProjectSkill에 존재하지 않는 skill을 넣고 저장하려고 해서 문제가 발생했습니다.
감사합니다.