inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 데이터 JPA

복합키 식별 관계 매핑에 대해서 여쭈어봅니다.

354

김예람

작성한 질문수 10

0

선생님...

현재 복합키 식별 관계의 mapping에서 선생님 책을 보고 인터넷을 찾아봐도 문제에 부딪혀 해결에 지쳐서 질문을 드립니다.

@IdClass(InternetBuzzIdentifier.class)
public class InternetBuzz {

@Id private String program;
@Id private String channel;
@Id private String days;
...
@Getter @Setter
public class InternetBuzzIdentifier implements Serializable {
private String program;
private String channel;
private String days;
...
@Entity
@Getter
@Setter
public class InternetBuzzMapping {

@Id @GeneratedValue
private Long id;
private String contentId;
private String contentsetId;

@OneToOne
@JoinColumns ({@JoinColumn (name = "program"),
@JoinColumn (name = "channel"),
@JoinColumn (name = "days")})
private InternetBuzz internetBuzz;

public InternetBuzzMapping(InternetBuzz internetBuzz) {
this.internetBuzz = internetBuzz;
}

 

처음에는 하나의 repository(InternetBuzz)을 만들었고  둘의 연결관계를 통해서 internetbuzz를 save하면 자동으로 InternetBuzzMapping 테이블에도 program, channel, days값이 들어가길 원하는데 internetbuzz.save()를 하면 internetbuzzmapping 테이블은 그대로입니다.

internetBuzzRepository.save(buzz);
internetBuzzMappingRepository.save(new InternetBuzzMapping(buzz));

 

그래서 internetbuzzMappingRepository를 만들어 위와같이 save를 하려하니

Caused by: java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : racoi.Dto.InternetBuzzMapping.internetBuzz -> racoi.Dto.InternetBuzz

위와같은 에러가 납니다.

 

어떤게 문제인지 책을 뒤져봐도 잘 이해가 안갑니다 ㅠ

spring-boot JPA java spring

답변 2

2

김예람

선생님 해결이 됬습니다.

 

InterneBuzz(부모클래스)에 cascadeType.ALL을 추가하고 객체에 서로 mapping과정을 추가하니깐 insert, delete가 연결되어 잘됩니다. 아직 영속성부분에 대해 이해가 부족해서 잘은 이해가 안가지만 조금씩 알아가고 있는것 같습니다 

@OneToOne(mappedBy = "internetBuzz", cascade = CascadeType.ALL)
private InternetBuzzMapping internetBuzzMapping;
InternetBuzzMapping mapping = new InternetBuzzMapping();
buzz.setInternetBuzzMapping(mapping);
mapping.setInternetBuzz(buzz);
mapping.getInternetBuzz().setChannel(channel);
mapping.getInternetBuzz().setDays(days);
mapping.getInternetBuzz().setProgram(program);
internetBuzzRepository.save(buzz);

0

김영한

안녕하세요. 김예람님

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

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

https://bit.ly/3fX6ygx

 

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

 

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

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

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

감사합니다.

 

changeTeam 메서드 질문

0

22

1

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

81

1

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

114

3

MemberRepository 구현체

0

65

1

pdf 표현 질문드립니다.

0

68

1

로그가 남지 않는 문제.

0

92

1

테스트 라이브러리가 강의는 junit4가 맞나요??

0

74

2

pdf 파일과 차이점이 있는 것같은데 문제 없나요?

0

74

2

@PrePersist, @PreUpdate 호출 시점 질문드립니다.

0

97

2

Sort 인터페이스는 잘 사용 안하나요?

0

54

1

스캔대상 질문드립니다.

0

47

1

하이버네이트6에서의 최적화에 이은 질문

0

89

1

save() vs saveAndFlush DB 통신 횟수

0

56

1

순수 JPA 리포지토리 코드 수정부분

0

88

2

bulk연산 후 flush하는 이유를 모르겠어요

0

156

3

bulk insert 질문입니다.

0

186

2

교만했던 것 같아요.

0

148

1

RESTful 강의는 안하시는 건지 궁금합니다.

0

152

2

동적 테이블에 대한 질문

0

87

1

영속성 전이와 연관관계

0

135

2

강의 10:25 질문

0

76

1

단건 update 질문

0

100

2

엔티티 와 도메인의 경계

0

129

1

UsernameOnlyDto 타입 type mismatch 오류

0

123

1