- 객체와 테이블 연관관계의 차이를 이해
- 객체의 참조와 테이블의 외래키를 매핑
- 용어 이해
용어 | 설명 |
방향 | 단방향, 양방향 |
다중성 | 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:N) |
연관관계의 주인 | 객체 양방향 연관관계는 관리 주인이 필요 |
연관관계가 필요한 이유
객체지향 설계의 목표는 자율적인 객체들의 "협력 공동체" 를 만드는 것이다.
예제 시나리오
- 회원과 팀이 있다.
- 회원은 하나의 팀에만 소속될 수 있다.
- 회원과 팀은 다대일 관계이다.
연관관계 설정 전
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 {
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setId(team.getId());
em.persist(member);
tx.commit();
}catch (Exception e){
tx.rollback();
}finally {
em.close();
}
emf.close();
}
}
위에 코드를 보면 객체 지향적인 느낌이 아닌 DB를 계속 다녀와야하는 로직을 수행하고 있다는 것을 알 수 있다.
객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력관계를 만들 수 없다!
- 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.
- 객체는 참조를 사용해서 연관된 객체를 찾는다.
- 테이블과 객체 사이에는 이런 큰 간격이 있다.
단방향 연관관계
객체 지향 모델링(객체 연관관계 사용)
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Column(name="USERNAME")
private String username;
@Column(name="TEAM_ID")
private Long teamId;
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
}
fk를 사용하려면 jpa에게 다중성(일대일, 다대일, 일대다, 다대다)을 알려줘야 한다.
- @ManyToOne을 이용하여 다대일을 설정한다.
- 참조할 Column의 이름을 설정한다.
연관관계 설정 후
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 {
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setTeam(team);
em.persist(member);
Member foundMember = em.find(Member.class, member.getId());
Team foundTeam = foundMember.getTeam();
tx.commit();
}catch (Exception e){
tx.rollback();
}finally {
em.close();
}
emf.close();
}
}
'JPA' 카테고리의 다른 글
양방향 연관관계와 연관관계의 주인 2 - 주의점 (0) | 2022.10.18 |
---|---|
양방향 연관관계와 연관관계의 주인 1 - 기본 (0) | 2022.10.17 |
쇼핑몰 만들기 1. 요구사항 분석과 기본 매핑 (0) | 2022.10.09 |
기본 키 매핑 (0) | 2022.10.08 |
필드와 컬럼 매핑 (0) | 2022.10.05 |