반응형
- 좀 더 연관관계를 맺어서 객체지향적으로 설계를 할 지에 대해 공부한다.
- 기본 매핑 같이 1대1로 매핑하는 것은 쉽고 이것은 객체가 지향하는 패러다임과 관계형이 지향하는 패러다임 이 사이에서 무언가를 잘 찾아야 하는 어려움이 있다.
- 방향, 다중성, 연관관계의 주인
- 연관관계의 주인이 어렵다.
- 책 추천 (조영호)
- 객체지향의 사실과 오해
- 오브젝트
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setTeamId(team.getId());
em.persist(member);
- 외래키 식별자를 직접 다뤄 데이터를 넣을 수 있다.
- TEAM이 먼저 생성되고 MEMBER가 생성된다.
Member findMember = em.find(Member.class, member.getId());
Long findTeamId = findMember.getTeamId();
Team findTeam = em.find(Team.class, findTeamId);
- 하지만 이렇게 할 경우 조회에 문제가 생긴다.
- 찾아온 멤버가 어느 팀 소속인지 알고 싶을 때 팀을 바로 못 가져오니까 계속 물어봐야 한다.
- 식별자로 다시 조회..
- 이런 방법은 객체 지향적인 방법은 아니다.
- 연관관계라는 게 없기 때문에 이렇게 된다.
private Team team;
- 누가 1이고 누가 다인지 JPA한테 알려줘야 한다.
- DB 관점에서 봐야 한다.
- MEMBER랑 TEAM이 있을 때 MEMBER가 1이고 TEAM이 1이다.
@ManyToOne
private Team team;
- 관계가 뭔지 정한다.
- 이렇게 ManyToOne으로 매핑해줘야한다.
- 옵션으로 지연로딩전략을 사용할 수 있는데 이건 뒤에서 따로 다룬다고 한다.
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
- 조인해야 하는 컬럼도 알려줘야 한다.
//저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setTeam(team);
em.persist(member);
// em.flush();
// em.clear();
Member findMember = em.find(Member.class, member.getId());
Team findTeam = findMember.getTeam();
System.out.println("findTeam.getName() = " + findTeam.getName());
- 이렇게 조인해서 저장할 수 있다.
- 영속성 컨텍스트에 이미 들어있는데 영속성 컨텍스트 말고 DB에 들어있는 것을 보고 싶을때 flush로 영속성 컨텍스트에 있는 것을 다 날려서 DB랑 맞추고 clear로 완전히 다 날려 확인할 수 있다.
자바 ORM 표준 JPA 프로그래밍 - 기본편을 참고하여 공부하였습니다.
반응형
'Data Base > JPA' 카테고리의 다른 글
[JPA] : 양방향 연관관계와 연관관계의 주인(Owner)에 대한 주의점 (0) | 2022.04.08 |
---|---|
[JPA] : 양방향 연관관계, 연관관계 주인(Owner) (0) | 2022.04.08 |
[JPA] : 기본 매핑하기 (0) | 2022.04.06 |
[JPA] : 기본 키 매핑 (0) | 2022.04.05 |
[JPA] : 필드와 컬럼 매핑 (0) | 2022.04.05 |
댓글