인프런 커뮤니티 질문&답변

jam님의 프로필 이미지
jam

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

[JPA] save할 때 @ManyToOne 필드가 null로 나옵니다.

작성

·

1.1K

·

수정됨

0

안녕하세요! 강의를 통해 JPA를 접하게 되어 간단한 프로젝트를 진행하고 있습니다.

프로젝트 진행 중 에러가 발생하여 질문드리고자 합니다!

 

아래는 답변 엔티티 코드입니다.

public class Answer {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(columnDefinition = "TEXT")
    private String content;

    @ManyToOn
    private Question question; //fk

    private LocalDateTime createAt;
    private LocalDateTime modifyAt;
}

보시는 것처럼 답변 엔티티에는 질문 엔티티(Question)가 fk로 설정되어 있습니다. 이 연관관계에서 이전까지는 아무런 문제없이 answer.save(..., ..., question, ..., ...); 을 하면 정상작동을 했지만, 갑자기 다시 기능을 실행하니 아래의 에러가 발생했습니다.

 

JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation

hibernater 쿼리를 확인하니 fk 필드가 null로 찍혔습니다.

 

위 에러와 쿼리를 보고 fk 필드에서 오류가 난 것을 알게 되어 확실한 이유 없이 @ManyToOne(fetch = fetchType.LAZY)로 수정하니 제대로 동작했습니다.

지연 로딩을 사용해야 한다는 말을 듣고 수정하긴 했지만 아직도 왜 해당 에러가 발생했는지는 모르겠습니다.

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. jam님

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.

2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

 

jam님의 프로필 이미지
jam
질문자

안녕하세요 강사님! 답변 감사드립니다 :)
아래 링크에서 프로젝트 압축 파일을 받으시면 됩니다.
https://drive.google.com/file/d/1EGQfAoCiNSEfl48gJKWCKeRsekJ__OfU/view?usp=sharing

1. 배포를 하지 않았기 때문에 로컬에서 실행하시면 됩니다.
- 사용하시는 DB를 먼저 실행시켜주세요 (저는 localhost, H2를 사용했습니다.)
- 이후 ide에서 SbbApplication.java를 실행하면 됩니다.
2. 질문에서 언급한 것처럼 지연 로딩 적용 후 해당 에러가 해결되어 다시 확인을 할 수 있을 지는 확신할 수 없습니다. 확실한 것은 제가 Answer Entity(sbb.Answer.Answer.java)와 Question Entity(sbb.Question.Question.java)에서 @ManyToOne를 적용한 필드에 (fetch = FetchType.LAZY)를 적용했더니 해결되었다는 것입니다.
발생 상황은 AnswerService의 create 메소드에서 save를 했을 때 입니다. 마찬가지로 QuestionService의 create 메소드에서 save를 했을 때 발생했습니다.

 

감사합니다.

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요.

@ManyToOne의 기본값은 (fetch=FetchType.LAZY)입니다.

따라서 다음 옵션을 넣어도 처음과 같습니다.

@ManyToOne(fetch = fetchType.LAZY)

오류 당시의 예제가 없어서, 문제를 찾기는 어려울 듯 합니다.

혹시 같은 오류가 발생하면 해당 오류 발생 케이스를 다시 정리해서 다시 질문을 남겨주세요^^

감사합니다.

jam님의 프로필 이미지
jam
질문자

감사합니다!

jam님의 프로필 이미지
jam

작성한 질문수

질문하기