기본키 제약조건
1. null 아님
2. 유일
3. 변하면 안된다
왠만하면 비즈니스와 관련없는 대체키를 사용해라 (시퀀스 || auto_increment )
※ 연관관계 매핑이론
- 여기서 하차하는 사람 많다고 했음 정신똑바로 차리고 고고
▷ 객체를 테이블에 맞추어 데이터 중심으로 모델링하면 협력관계를 만들 수 없다
- 테이블은 외래키로 조인을 사용해서 연관된 테이블을 찾는다.
- 객체는 참조를 사용해서 연관된 객체를 찾는다
- 테이블과 객체 사이에는 이런 큰 간격이 있다.
▶ 단방향 매핑
▷ 데이터지향적모델링
▷ 객체지향적 모델링
@joinColumn : 연관관계를 적어준다 (name = "TEAM_ID") 요렇게
- 이렇게 써주면 Team 테이블의 Id 컬럼과 FK 로 매핑이된다 = 연관관계매핑
@ManyToOne : 조인하기 싫어 ! 멤버만 가지고 싶어 ! => 옵션을 넣어주면됨 ▽
- @ManyToOne(fetch = FetchType.LAZY)
ㄴ 멤버만 조회됨 (Team 객체는 실제 사용되는 시점에 코드를 추가로 넣어주면된다)
- findTeam.getName(); < = 이런식으로. 이걸 지연로딩이라고 함
김영한님은 모두 FetchType을 LAZY 로 바르라고 권장
▷ persist (등록)
그래서 이렇게 persist 인자로 Team 객체를 넣어주기만하면 알아서 쿼리를 짜줌
▷ persist (수정)
▷ find (조회)
= > 조회할때도 getTeam 으로 바로 조회할 수 있다
▶ 양방향 매핑
양방향매핑이란 ? : Member에서도 Team 을 가고싶고, Team 에서도 Member로 가고싶다 !
ex ) A 팀에 속한 멤버리스트를 모두 가져오고싶음 : team.getMemberList();
- 양방향매핑은 사실 그렇게 좋은방법이 아니니, 일단 단방향으로 설계를 다 해놓고
꼭 양방향매핑을 사용해야 하는 경우 사용하자 !
@OneToMany 어노테이션을 추가하고 컬렉션을 넣어주면됨 => 역방향으로 조회가능
객체의 양방향관계는 사실 양방향 관계가 아니라
서로다른 단방향 관계 2개이다 (짭양방향)
벗 테이블 연관관계는 FK 한개만 있으면 서로 조인할 수 있다 (찐양방향)
★ 여기서 생기는 문제 ★
만약 team 에다가 members 를 넣는다면 ..?
member.setTeam(); 을 해도 member 가 업데이트되고
team.members 에 값을 넣어도 member 가 업데이트 됨
그렇담 둘 중 어떤걸 믿어야할까 ?
== > 두개는 어차피 다르니, 둘중에 주인(owner) 를 정하고, 한놈은 조회만하게 만들자 ! 라고 똑똑이가 정함
▶ 연관관계의 주인 (양방향 매핑규칙)
- 객체의 두 관계 중 하나를 연관관계의 주인으로 지정
- 연관관계의 주인만이 외래키를 관리(등록,수정)
- 주인이 아닌쪽은 조회만 가능
- 주인이 아니면, mappedBy 속성으로 주인 지정
- 주인은 mappedBy 속성을 사용할 수 없음
= > member.team 과 team의members 둘중에 하나만 연관관계의 주인으로 정할 수 있음
이렇게 주인을 정하고 두개 한번에 업데이트를하면, 주인것만 업데이트 됨
mappedBy : (mappedBy = "team")
- team 은 종속되었다 (team은 Member에 매핑이"되었다" = Member가 주인)
- team 에서 값을 업데이트해봤자 DB에 영향을 줄 수 없음
team.getMembers().add(member); => 영향을 줄 수 없음
member.setTeam(team); => 정상반영
쨋든 객체관점에서 생각했을 때 두개 코드를 다 날려주는게 좋음
▷ 그렇담 누구를 주인으로 정하는게 좋을까 ?
- 외래키가 있는곳을 주인으로 정해라 (Member) => 인지부조화가 안생김
ex ) team 을 update 했는데 왜 Member 테이블이 update 되지 ? !!!! => 멘붕
ㄴ 이런걸 방지하기 위해
▷ find (조회)
▶ 연관관계 매핑 어노테이션
@ManyToOne : 다대일
@OneToMany : 일대다
@OneToOne : 일대일
@ManyToMany : 다대다
@JoinColumn, JoinTable
'JPA' 카테고리의 다른 글
[JPA] 지금껏 Mybatis 잘 쓰다가 왜 JPA ? / JPA 란 / JPA 기초 (0) | 2022.07.24 |
---|