Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

단방향 연관관계 본문

인프런/[인프런] 자바ORM 표준 JPA 프로그래밍

단방향 연관관계

Seung__ 2021. 8. 9. 23:37

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


 

GitHub - bsh6463/JPA

Contribute to bsh6463/JPA development by creating an account on GitHub.

github.com

 

Comments