BE전문가 프로젝트

일대다(1:N) 본문

JPA

일대다(1:N)

원호보고서 2022. 10. 20. 23:02

@Entity
public class Team {

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

    private String name;

    @OneToMany
    @JoinColumn(name = "TEAM_ID")
    private List<Member> members = new ArrayList<>(); //ArrayList로 초기화 하는 것(관례) add시 nullpoint가 안뜬다.
}
package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JPAMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();                                     //트랜잭션 시작

        try {

            Member member = new Member();
            member.setUsername("member1");
            em.persist(member);
            
            Team team = new Team();
            team.setName("teamA");
            team.getMembers().add(member);

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

main method를 실행시켜보면 member를 insert하고 team을 insert한 후 update쿼리로 외래키를 설정해준다.

일대다로 설정하게 되면 update 쿼리가 따로 나가기 때문에 성능상 문제가 생길 수 있다. 뿐만아니라 실무에서는 테이블이 수 없이 많기 때문에 운영에서 어려움을 느낄 수 있다. 따라서 다대일 단방향 매핑을 우선적으로 하며 필요 시 양방향 매핑을 추가하는 것을 권장한다.

 

일대다 단방향 정리

  • 일대다 단방향은 일대다(1:N)에서 일(1)이 연관관계의 주인
  • 테이블 일대다 관계는 항상 다(N) 쪽에 외래 키가 있음
  • 객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하는 특이한 구조
  • @JoinColumn을 꼭 사용해야 함. 그렇지 않으면 조인 테이블 방식을 사용함(중간에 테이블을 하나 추가함)

 

일대다 단방향 매핑의 단점

  • 엔티티가 관리하는 외래 키가 다른 테이블에 있음(큰 단점)
  • 연관관계 관리를 위해 추가로 UPDATE SQL 실행
  • 일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하자

 

Comments