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
관리 메뉴

개발자되기 프로젝트

일대다[1:N] 본문

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

일대다[1:N]

Seung__ 2021. 8. 10. 23:01

1. 일대다 단방향 매핑.


  • "일"이 연관관계 주인.?
  • 이 모델은 권장하진 않음..
  • 표준에서 지원하긴 함.
  • Team에서 Member를 참조하나 Member는 Team을 참조하지 않음..
  • 하지만 DB입장에서 FK는 MEMBER("다")에 있음
  • 즉, Team의 members를 변경했을 때, MEMBER 테이블의 TEAM_ID(FK)를 변경해야함.
    -> 다른 테이블의 FK를 업데이트를 해야함..

 

2. TEST


@Entity
public class Team {


    @Id
    @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;

    private String name;

    @OneToMany
    @JoinColumn(name = "TEAM_ID")
    private List<Member> memberList = new ArrayList<>();
    try{

            Member member = new Member();
            member.setUserName("hahahaha");
            em.persist(member);

            Team team = new Team();
            team.setName("teamA");
            team.getMemberList().add(member);
            em.persist(team);

            tx.commit();

        }catch (Exception e){
            tx.rollback();
        }finally {
            em.close();
        }

        emf.close();

    }
  • 업데이트 쿼리가 추가로 나갔다.
    • team.getMemberList().add(member);
    • team의 memberList를 변경하면 MEMBER 테이블의 TEAM_ID(FK)를 변경해야 한다.
    • 즉 TEAM 테이블이 아닌 MEMBER 테이블을 변경해야 하기 때문에. 업데이트 쿼리가 나가야한다.
Hibernate: 
    /* create one-to-many row hellojpa.Team.memberList */ update
        Member 
    set
        TEAM_ID=? 
    where
        MEMBER_ID=?

 

 

 

3. 그럼 왜 잘 안쓸까?


  • 객체를 수정한 것 과 쿼리가 날라가는게 달라지게 된다.
  • Team을 수정했더니 TEAM 테이블이 아니라 MEMBER 테이블이 업데이트된다...? 뭐야??!???? 이래됨.
  • 차라리 다대일 단방향 으로 설계하고, 필요시 양방향으로 추가.

 

4. 일대다 단방향 정리


  • 일대다 단방향은 일대다에서 "일"이 연관관계 주인
  • 테이블은 일대다 관꼐는 항상 "다"쪽에 외래 키가 있음
  • 객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하는 특이한..구조 ㅜ
  • @JoinColumn을 꼭! 사용해야 함. 그렇지 않으면 join table 방식을 사용함.
    (중간 테이블을 하나 추가함.->성능 이슈 및 운영에 영향)
  • 일대다 단방향 매핑의 단점
    • 엔티티가 관리하는 외래 키가 다른 테이블에 있음.. 맘에안들어..
    • 연관관계 관리를 위해 추가 UPDATE SQL 실행
  • 일대다 단방향 매핑 보다는.. 다대일 양방향 매핑을 사용하자.

 

 

 

5. 일대다 양방향....?ㄷㄷㄷ


  • 야매로 되긴 됨.. 스펙은 아님..

  • 요렇게 하면 됨.. 강제로 읽기 전용으로 만들면 됨 ㅋㅋㅋ
    • Member -> Team 
      @ManyToOne
      @JoinColumn(name = "TEAM_ID", insertable = false, updatable = false)
      private Team team;
    • 이렇게 하면 연관관계 주인같은데....
    • insertable = false, updatable=false로 하면 insert, update안하니 읽기 전용처럼 됨.

 

6. 일대다 양방향 정리


  • 공식적으로 없다. 야매다 ㅋㅋ
  • @JoinColumn(insertable = false, updatable = false)
  • 읽기 전용필드로 만들어서 양방향 처럼 사용
  • 그냥 다대일 양방향을 사용하자 ㅋㅋㅋ

'인프런 > [인프런] 자바ORM 표준 JPA 프로그래밍' 카테고리의 다른 글

다대다[N:M]  (0) 2021.08.11
일대일[1:1]  (0) 2021.08.10
다대일 매핑[N:1]  (0) 2021.08.10
[예제] 연관관계 추가  (0) 2021.08.10
양방향 연관관계와 연관관계 주인 - 주의점  (0) 2021.08.10
Comments