프로젝트/향수

JPA외래키 설정시 데이터 입력 방향

은세고화 2022. 2. 16. 07:53
반응형

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