JPA 연관관계

정훈·2022년 7월 11일
0

jpa

목록 보기
1/2

연관관계, ? 단방향, 양방향관계

방향 :멤버와 팀 이라는 관계를 생각할때

단방향으로 멤버=> 팀 , 팀 => 멤버 참조
양방향으론 멤버=>팀 , 팀 => 멤버 참조 

방향은 객체관계에만 존재하고 테이블 관계에 있어서는 항상 양방향이다.

다중성으로는 : 1:1, 1:N , N:1 , N:N

연관관계의 주인

  • 두 연관관계중에서 주인을 정해야하고
  • 연관관계의 주인만이 연관관계와 매핑되고 외래키를 관리 (등록,수정,삭제)를 할수 있고 주인이 아닌 것은 조회만

-연관관계 주인은 mappedBy속성으로 정해줌 주인x 면 사용하지않음

1:1관계

@OneToOne: 일대일 단방향 관계를 매핑하고, @Joincolumn을 넣어줌
팀 entity에 mappedBy를 적용시키면 일대일 양방향 관계 매핑이됨 .

// 팀 Entity 
@Entity
public class Team{
	...
    ...
    @OneToOne (mappedBy ="Team")
//멤버필드의 팀과 매핑이 되었다는것을의미 
    private Member = member; 
}


// 멤버 Entity 
@Entity 
public class Member{
...
...
@OneToOne
@JoinColumn(name="Team_id")

private Team team;
}
  • 주 테이블 은 멤버 지만 외래키를 담당하는 테이블인 팀이 읽기전용이됨 .

N:1 (다대일)

-다대일 관계에서 다 인 멤버쪽에 팀을 단방향으로 참조하고싶을때,
-테이블에있는 외래키를 멤버 객체에서 팀 객체로 연관매핑을하면됨.
-다대일의 반대는 일대다

다대일 단방향 매핑 
member 클래스 
@ManyToOne
@JoinColumn(name="Team_id")
private Team team;

반대인 Team은 ? @OneToMany

팀 클래스 
@OneToMany(mappedBy="team")
private List<Member>members=new ArrayList<>();

mappedBy= 주인 엔티티 필드에 붙이면됨 .
연관관계의 주인은 mappedBy를 사용하지않음 .

1:N(일대다)
일대다에서는 1쪽이 연관관계의 주인 임
일쪽에서 외래키를 관리함
-실무ㅅ에서는 이러한모델을 권장하지않는다고함 -

일대다 단방향 매핑

public class Team{
@OneToMany
@JoinColumn(name="Team_id)
private ... .. 
}

-연관관계의 주인은 1이고, 테이블관계에있어서 일대다는 항상 다 쪽에 외래키가 있음.
-객체와 테이블의 페러다임 (?) 차이때문에 반대편에서 외래키를 관리한다고함

일대다 양방향 매핑

  • @ManyToOne과 조인컬럼을 사용하면 다대일 단방향 매핑이되어버리는데, team에서 이미 일대다 단방향 매핑이 설정되어있음. 두 객체 모두 테이블의 FK키를 관리하는 상황이벌어짐
  • @JoinColumn(name="!#!#%", insertable=false,updatable=false) 를 설정하여 읽기전용필드로 사용해서 양방향매핑처럼 사용하는 방법 임

테이블이 얼마나 생기고 할지모르니, 설계나 매핑은 단순하게

다대다 매핑 , 한계

  • 테이블이 수량같은 추가데이터나 시간 등등 들어갈수있기때문에 매핑정보넣는것은 가능하지만 , 추가정보를 넣는것은 자체가 불가능함
  • 그중간중간 테이블이 숨겨져있기때문에 예상치못한 쿼리들이 나갈수있으므로 이러한 문제들 때문에 실무에서는 추천을안하고 안쓰는게 맞다고 본다라고 생각함.

유저 와 상품 그리고 유저의상품 관계를 다대다 관계로 매핑시

@Entity
public class User{
@OneToMany(mappedBy="user")
private List<MemberProduct> memeberproducts = new ArrayList<>(); 

//new ArrayList를 사용하는이유는 nullExcepction이 발생해서 

@Entity
pulbic class Product{

@OneToMany(mappedBy="product")
private List<MemberProduct> memebers =new ArrayList();
}


@Entity
@Data
public class MemberProduct{
  @Id
  @GeneratedValue
  private Long id;
  
  @ManyToOne
  @JoinColumn(name="member_id")
  private Member member;
  
   @ManyToOne
  @JoinColumn(name="product_id")
  private Product product;
  
}

0개의 댓글