반응형
A, B, C테이블이 있다. A oneToMany B C oneToMany B 이렇게 구성되어 있다.
B테이블은 ManyToOne으로 양쪽 테이블과 연결되어 있다면 데이터를 삽입할 때 어느테이블에 삽입해야할까?
답은 부모테이블을 먼저 채운 후 자식 테이블을 채워야 한다.
만약 B테이블에 A테이블의 값을 넣고싶은 경우 A테이블에 값을 넣고 B테이블에 넣어야 한다.
mappedBy는 보통 부모테이블에 셋팅한다.
예시를 들어보자
Perfume테이블과 PreferencePerfume테이블이 일대다 관계이다.
@Getter
@NoArgsConstructor
@Entity
public class Perfume {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String perfumeName;
private String image;
@OneToMany(mappedBy = "perfume")
private List<PreferencePerfume> prePerfume;
@Builder
public Perfume(String perfumeName, String image){
this.perfumeName = perfumeName;
this.image = image;
}
}
@Getter
@Setter
@NoArgsConstructor
@Entity
public class PreferencePerfume{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "perfume_id")
private Perfume perfume;
private String isPreference;
@Builder
public PreferencePerfume(Perfume perfume, String isPreference){
this.perfume = perfume;
this.isPreference = isPreference;
}
}
다음은 테스트코드다
//부모테이블(perfume)에 먼저 데이터를 삽입해야 preperfume에 데이터삽입 가능
Perfume p1 = Perfume.builder().perfumeName("불가리").image("이미지 링크").build();
Perfume p2 = Perfume.builder().perfumeName("조말론").image("이미지 링크").build();
Perfume p3 = Perfume.builder().perfumeName("크리드").image("이미지 링크").build();
perfumeRepo.save(p1);
perfumeRepo.save(p2);
perfumeRepo.save(p3);
List<Perfume> perfumes = perfumeRepo.findAll();
for (Perfume p: perfumes) {
preRepo.save(PreferencePerfume.builder().perfume(p).isPreference("Y").build());
}
List<PreferencePerfume> pre = preRepo.findAll();
for (PreferencePerfume pp: pre) {
System.out.println("------------------JPA===-------------");
System.out.println(pp.getIsPreference());
System.out.println(pp.getPerfume().getPerfumeName());
}
여기서 perfumeRepo.save로 perfume을 넣지 않는다면 에러가 발생한다.
외래키로 테이블을 생성했을 때 넣는 방향과 JPA설정을 몰라서 굉장히 오랜시간 애를 먹었었지만 무사히 해결했다.
반응형
'프로젝트 > 향수' 카테고리의 다른 글
데이터베이스 설계문제 (0) | 2021.11.22 |
---|---|
No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type (1) | 2021.09.02 |
no httpMessageConverter for (0) | 2021.08.25 |
should have [public, protected] no-arg constructor (0) | 2021.08.24 |
java.net.UnknownHostException (0) | 2021.08.18 |