Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Android
- SpringBoot
- jpa
- springdatajpa
- 그리디
- Spring Boot
- Exception
- java
- QueryDSL
- 자바
- http
- 스프링
- 백준
- transaction
- db
- AOP
- 인프런
- Proxy
- Servlet
- spring
- pointcut
- 알고리즘
- kotlin
- 스프링 핵심 원리
- 김영한
- 스프링 핵심 기능
- JDBC
- JPQL
- Greedy
- Thymeleaf
Archives
- Today
- Total
개발자되기 프로젝트
단방향 연관관계 본문
1. 목표
- 객체와 테이블 연관관계의 차이를 이해
- 객체의 참조와 테이블의 외래 키를 어떻게 매핑?
- 객체는.. 레퍼런스임.. object.get~ 인 반면에 테이블은 나랑 연관된 애를 찾을 때 외래키(FK)를 활용.
2. 용어
- 방향(Direction) : 단방향, 양방향
- 다중성(Multiplicity) : 다대일, 일대다, 일대일, 다대다
- 연관관계 주인(Owner) : 객체 양방향 연관관계는 관리 주인이 필요해!
3. 연관관계가 필요한 이유.
객체지향 설계의 목표는 자율적인 객체들의
협력 공동체를 만드는 것
- 객체지향의 사실과 오해 -
4. 예제 시나리오
- 회원과 팀이 있다.
- 회원은 하나의 팀에만 소속될 수 있다.
- 회원과 팀은 다대일 관계다.
5. 객체를 테이블에 맞춰서 모델링 하면..?
- 객체를 테이블에 맞춰서 데이터 중심으로 모델링을 하면
- 협력 관계를 만들 수 없다!!!!
- 테이블은 외래 키로 조인을 이용해서 외래 키를 가지고 연관된 테이블을 찾는다.
- 객체는 참조를 사용해서 연관된 객체를 찾는다.
- 이처럼 테이블과 객체 사이에는 이런~~~큰~~ 차이가 있다.
- 어떻게 해야하는데?
6. 단방향 연관관계
- Member class
- Member는 Team의 참조값을 가지고 있음, Member에서 Team참조 가능
- Team에서 Member 참조 안됨.
- Member와 Team을 다대일 관계 --> @ManyToOne
- Team 객체와 FK를 매핑시켜야 함
- @JoinColumn
@ManyToOne
@JoinColumn(name = "TEAM_ID") //Team 객체와 Team FK를 매핑
private Team team;
7. Test
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try{
Team team = new Team();
team.setName("TeamA");
em.persist(team); //team이 영속상태 되면 id값이 들어감.
Member member = new Member();
member.setUserName("member");
member.setTeam(team); //set을 통해 연관관계 매핑.
em.persist(member);
//member의 소속 팀 찾기....흠..
Member findMember = em.find(Member.class, member.getId());
Team findTeam = findMember.getTeam();
System.out.println("findTeam = " + findTeam.getName());
tx.commit();
}catch (Exception e){
tx.rollback();
}finally {
em.close();
}
emf.close();
}
- Team과 Member의 insert SQL만 실행되었다.
- Select SQL은..????? 1차 캐시에서 조회했기 때문에 select쿼리 안돌아갔다 ㅋㅋ
Hibernate:
/* insert hellojpa.Team
*/ insert
into
Team
(name, TEAM_ID)
values
(?, ?)
Hibernate:
/* insert hellojpa.Member
*/ insert
into
Member
(TEAM_ID, USERNAME, MEMBER_ID)
values
(?, ?, ?)
- 만약 팀을 바꾸고 싶다???
- 영속상태 팀을 가져와서 set으로 변경하면됨.
- member는 영속상태이기 때문에(perist했음) commit시 dirty checking 대상이다.
- FK가 변경이 된다~~
//멤버의 팀 변경, member 는 영속상태
Team newTeam = em.find(Team.class, 100L); //em 통해서 가져온 team은 영속상태.
member.setTeam(newTeam); //FK 변경됨.
8. GitHub : 210809 EXAMPLE1
'인프런 > [인프런] 자바ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
양방향 연관관계와 연관관계 주인 - 주의점 (0) | 2021.08.10 |
---|---|
양방향 연관관계와 연관관계 주인. (0) | 2021.08.10 |
예제 : 요구사항 분석과 기본 매핑. (0) | 2021.08.09 |
기본 키(PK) 매핑 (0) | 2021.08.09 |
필드와 컬럼 매핑 (0) | 2021.08.09 |
Comments