Article에 Tag를 추가하고 난 뒤 게시글을 추가할때 다음과 같은 오류가 발생했다.
Caused by: java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation : com.realworld.study.article.domain.ArticleTag.article -> com.realworld.study.article.domain.Article
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:161) ~[hibernate-core-6.1.5.Final.jar:6.1.5.Final]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:175) ~[hibernate-core-6.1.5.Final.jar:6.1.5.Final]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:182) ~[hibernate-core-6.1.5.Final.jar:6.1.5.Final]
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:752) ~[hibernate-core-6.1.5.Final.jar:6.1.5.Final]
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:719) ~[hibernate-core-6.1.5.Final.jar:6.1.5.Final]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
아래의 코드의 articleTagRespository.save(articleTag)에서 일어났다.
public Article createArticle(
final String authorEmail,
final ArticleCreateRequest articleCreateRequest) {
... 대충 게시글 생성하고 태그 생성하는 로직
articleCreateRequest.getTagList().forEach(tagName -> {
Tag tag = getTagOrElseCreate(tagName);
ArticleTag articleTag = new ArticleTag(article, tag);
articleTagRepository.save(articleTag);
});
return articleRepository.save(article);
}
ArticleTag는 Article의 id, Tag의 id를 foreign key로 잡고 있다.
위 오류는 article 변수 때문에 발생하는 것인데,
article는 articleTagRespository.save(articleTag) 를 호출하는 시점에 DB에 실제하지 않는다.
article.id는 초기값 null이므로 TransientPropertyValueException예외가 발생하는 것이다.
해결.
아래와 같이 articleTag를 save 하기 전에 article을 save 했다.
public Article createArticle(
final String authorEmail,
final ArticleCreateRequest articleCreateRequest) {
... 대충 게시글 생성하고 태그 생성하는 로직
Article savedArticle = articleRepository.save(article);
articleCreateRequest.getTagList().forEach(tagName -> {
Tag tag = getTagOrElseCreate(tagName);
ArticleTag articleTag = new ArticleTag(savedArticle, tag);
articleTagRepository.save(articleTag);
});
return savedArticle;
}
Article에 대한 테스트가 전부 통과한 것은 덤!
'프로그래밍 > 기타' 카테고리의 다른 글
LocalDateTime의 약간 이상한 시간 표시 (0) | 2023.02.22 |
---|---|
백준 허브 커스터마이징 (3) | 2023.01.25 |
9번째 스프린트 회고 - 게시판 좋아요 구현과 JWT활용 (0) | 2023.01.25 |
백준 허브 사용 후기 (0) | 2023.01.21 |
스타듀밸리 순무 모드 업데이트 0.7.0 (1) | 2023.01.18 |