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

김예람님의 프로필 이미지
김예람

작성한 질문수

실전! 스프링 데이터 JPA

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

작성

·

286

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

위와같은 에러가 납니다.

 

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

답변 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. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

 

김예람님의 프로필 이미지
김예람

작성한 질문수

질문하기