inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

1215

jam

작성한 질문수 4

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)로 수정하니 제대로 동작했습니다.

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

jpa spring @ManyToOne 지연로딩

답변 1

0

김영한

안녕하세요. jam님

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

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

https://bit.ly/3fX6ygx

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

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

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

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

감사합니다.

 

0

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를 했을 때 발생했습니다.

 

감사합니다.

0

김영한

안녕하세요.

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

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

@ManyToOne(fetch = fetchType.LAZY)

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

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

감사합니다.

0

jam

감사합니다!

RepositoryTest의 패키지 위치가 domain인 이유

0

35

2

REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!

0

31

1

update()에 사용하는 setter 질문드립니다.

0

49

1

SQL 중심적 개발의 문제점에 대한 질문

0

72

1

혹시 Containing 을 안쓰신 이유가 있을까요?

0

86

2

[공유] 스프링부트 4.x 버전 mybatis 연동

0

180

1

@repository 어노테이션

0

89

3

ItemService

0

59

1

논리 커밋, 물리 커밋 질문드립니다.

0

54

1

내부 트랜잭션 커밋은 필수인가요?

0

57

1

프록시 커넥션 객체를 반환할 때 생성하는건가요?

0

55

1

Transaction readOnly 성능 개선 (김영한님의 대한 감사인사)

2

180

2

JPQL 대신 네이티브 쿼리를 사용해야 하는 경우

0

80

1

@EventListener(ApplicationReadyEvent.class) 관련

0

88

1

트랜잭션 동기화 매니저와 데이터 소스

0

77

1

DB 관련 강의 개설 계획은 없으신건가요?

0

133

2

물리 트랜잭션 과 논리트랜잭션 용어를 맞게 이해한걸까요

0

94

1

스프링 3 버전 이상 rollbackFor 변경된듯요

1

113

1

트랜잭션 전파 질문.

0

87

1

프로젝트 오픈 에러

0

126

1

외부 트랜잭션에서 isNewTransaction이 false로 나오는거에 대해 질문드립니다

0

84

2

같은 스레드를 사용하면 트랜잭션 동기화 매니저는 같은 커넥션을 반환

0

73

1

h2 인메모리 테스트중 예약어 충돌날 경우 대처방법

0

104

1

커스텀aop와 트랜잭션을 같이 사용할때 우선순위에 관한 질문

0

98

2