JPA 연관관계가 쉬운 이유?

이상민·2024년 8월 28일
0

JPA 연관관계가 쉬운 이유?

사실 연관관계는 하나 밖에 없다?

데이터 칸에 들어갈 수 있는 데이터의 개수는 1개이다**(중요)

예로 id 1,2 이런식으로 들어갈 수 없다

데이터베이스 컬럼 하나에는 값이 하나빡에 들어가지 못한다 (꼭 인지)

테이블의 필드값으로 리스트는 본질적으로 들어가는 것이 불가능하다

연관관계

1:1 ?

쓰지말고 그냥 테이블 하나로 사용하자
불가능한건 없지만 복잡한 길이다
테이블 쪼개면 골치 아프다...
억지로 테이블을 나누지 말자

1:N


여기서 우리가 유심히 봐야할 부분은 바로
private List<Comment> comments = new ArrayList<>();

근데 리스트가 있다??

사실상 유일한 연관관계 (=N:1 사실상 같은말)

리스트?
실제 데이터 베이스에는 존재하지 않는 개념

JPA가 해주는 것

4차원을 상상하기에는 어렵다

실제론 없지만 마치 있는 것처럼 JPA가 해준다

@ManyToOne,@OneToMany 어떻게 해야할까?

  1. @OneToMany@ManyToOne이 없으면 존재할 수 없다 (이건 법칙 @ManyToOne 이 있어야 @OneToMany가 올수 있다)
    -> @ManyToOne부터 일단 넣고 생각하기
  2. 어디다가? @ManyToOne 더 개수가 많은 놈한테 건다(@OneToManyList<>가 온다)
  • ex) 댓글 vs 게시글 -> 댓글에 달아야한다
  1. N:M은 중간 테이블이 필요하다
  • 중간테이블에 @ManyToOne 2개 선언해주면 된다.
  1. @ManyToOne에는 무조건 (fetch = FetchType.LAZY)(같이 가는것)를 걸어줘야한다
  2. @ManyToOne의 단짝 @JoinColumn(name = ("내가매핑할놈의(상대방) id") -> 그냥 써주자
  • @OneToMany에게 무조건 해줘야 하는것(mappedBy = "나자신")

N:M?

사실 이런건 존재하지 않는다

그냥 @ManyToOne을 2번 쓰면 그게 바로 N:M이다
그러므로 사실상 존재하지 않는다

리스트를 필드에 선언할 수 없기 때문에 중간에 @ManyToOne을 2개 가지는 테이블을 만들어준다

그리고 각각 있었던 엔티티에 필요하면 @OneToMany를 사용해준다

흐름상 @ManyToOne을 걸고 나서 @OneToMany를 걸지 말지를 판단하자

영속성 전이 삭제

    @OneToMany(mappedBy = "board", cascade = CascadeType.REMOVE)
    private List<Comment> comments = new ArrayList<>();

참고
누군가 8080을 사용하고 있다면?
kill $(lsof -t -i:8080) 을 이용하자

profile
안녕하세요

0개의 댓글