BE전문가 프로젝트
일대다(1:N) 본문
@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 실행
- 일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하자
'JPA' 카테고리의 다른 글
쇼핑몰 만들기 2 - 다양한 연관 관계 매핑 (0) | 2022.10.27 |
---|---|
일대일(1:1) (0) | 2022.10.23 |
다대일(N:1) (0) | 2022.10.18 |
양방향 연관관계와 연관관계의 주인 2 - 주의점 (0) | 2022.10.18 |
양방향 연관관계와 연관관계의 주인 1 - 기본 (0) | 2022.10.17 |
Comments