본문 바로가기
Data Base/JPA

[JPA] : 연관관계 매핑 기초

by 오주현 2022. 4. 6.
반응형
  • 좀 더 연관관계를 맺어서 객체지향적으로 설계를 할 지에 대해 공부한다.
  • 기본 매핑 같이 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 프로그래밍 - 기본편을 참고하여 공부하였습니다.

반응형

댓글