[자바 ORM 표준 JPA 프로그래밍 - 기본편] 6-2강
https://inf.run/2zDo 강의를 수강하고 작성하는 게시물입니다.
1. 일대다 [1:N]
이 모델은 권장하지 않는데 만약 일이 연관관계의 주인이면 어떻게 될까?
단방향의 경우
테이블의 일대다 관계에서는 무조건 다(N) 쪽에 외래키가 존재한다.
객체와 테이블의 차이 때문에 반대편 테이블의 외래키를 관리하는 특이한 구조이다.
@JoinColumn을 꼭 사용해야한다. 그렇지 않으면 조인 테이블방식을 사용하게된다.(중간에 중간테이블이 하나 추가된다.)
아래처럼 작성하면된다.
/* 수정 전
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
*/
// 수정 후
@OneToMany
@JoinColumn(name="TEAM_ID")
private List<Member> members = new ArrayList<>();
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
Member member = new Member();
member.setUsername("member1");
em.persist(member);
Team team = new Team();
team.setName("TeamA");
team.getMembers().add(member);
// team은 저장이 되는것이 맞지만 바로 윗줄은 좀 애매하다. team테이블에 저장되는 것이 아닌 member테이블에서 저장하므로 member테이블에서 update 쿼리가 나간다.
em.persist(team);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
}
나중에 실무로 일하다보면 테이블도 많아지고 복잡해지기 때문에
Team을 수정했는데 Member테이블이 수정되기 때문에 유지보수 중에 혼란해질 수 있다.
그래서 일대다 단방향은 다대일에서 양방향 매핑으로 변경하여 사용하면 편해진다.
양방향의 경우
설명을 위해 억지성이 조금 있다. 이 매핑은 공식적으로 존재하지 않는다.
읽기 전용 필드를 사용해서 양방향처럼 사용하는 방법이다.
@ManyToOne
@JoinColumn(name = "TEAM_ID", insertable = false, updatable = false)
private Team team;
다대일 양방향을 사용하는 것이 편하다.
댓글 남기기