연관관계, ? 단방향, 양방향관계
방향 :멤버와 팀 이라는 관계를 생각할때
단방향으로 멤버=> 팀 , 팀 => 멤버 참조
양방향으론 멤버=>팀 , 팀 => 멤버 참조
방향은 객체관계에만 존재하고 테이블 관계에 있어서는 항상 양방향이다.
다중성으로는 : 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이고, 테이블관계에있어서 일대다는 항상 다 쪽에 외래키가 있음.
-객체와 테이블의 페러다임 (?) 차이때문에 반대편에서 외래키를 관리한다고함
테이블이 얼마나 생기고 할지모르니, 설계나 매핑은 단순하게
유저 와 상품 그리고 유저의상품 관계를 다대다 관계로 매핑시
@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;
}