JPA ) 자바 ORM 표준 JPA 프로그래밍 - 6

GoRuth·2025년 4월 20일

JPA

목록 보기
6/8

1. 다대일

1.1. 단방향

@Entity
@Data
public class A {
	@Id
	@Column(name = "A_ID")
	private Long id;

	@ManyToOne
	@JoinColumn(name = "B_ID")
	private B b;

	private String aa;
}

-- 🔺는 A 클래스 , 🔻는 B클래스

@Entity
@Data
public class B {
	@Id
	@Column(name = "B_ID")
	private Long id;

	private String bb;
}

1.2. 양방향

@Entity
@Data
public class A {
	@Id
	@Column(name = "A_ID")
	private Long id;

	@ManyToOne
	@JoinColumn(name = "B_ID")
	private B b;

	private String aa;
}

-- 🔺는 A 클래스 , 🔻는 B클래스

@Entity
@Data
public class B {
	@Id
	@Column(name = "B_ID")
	private Long id;

	@OneToMany(mappedBy = "b")
	private List<A> a_list = new ArrayList<>();

	private String bb;
}

2. 일대다

2.1. 단방향

단점
매핑한 객체가 관리하는 외래 키가 다른 테이블에 있음
연관관계 처리를 위해 UPDATE SQL이 추가로 실행

@Entity
@Data
public class A {
	@Id
	@Column(name = "A_ID")
	private Long id;

	private String aa;
}

-- 🔺는 A 클래스 , 🔻는 B클래스

@Entity
@Data
public class B {
	@Id
	@Column(name = "B_ID")
	private Long id;

	@OneToMany(mappedBy = "b")
	private List<A> a_list = new ArrayList<>();

	private String bb;
}

2.2. 양방향

  • 일대다 양방향 매핑은 존재하지 않는다.
  • 불가능은 아니지만 일대다의 단점을 그대로 가짐

3. 일대일

  • 양쪽이 서로 하나의 관계만 가짐
  • 주 Table, 대상 Table 둘 중 어느 곳이나 외래 키를 가질 수 있음
  • 주 Table 외래 키
    • 확인해도 대상 테이브과 연관관계가 있는 지 알 수 있음
  • 대상 Table 외래 키
    • DB 관계를 일대일에서 일대다로 변경할 때, 테이블 구조를 그대로 유지가능

3.1. 주 테이블 단방향

@Entity
@Data
public class A {
	@Id
	@Column(name = "A_ID")
	private Long id;

	@OneToOne
	@JoinColumn(name = "B_ID")
	private B b;

	private String aa;
}

-- 🔺는 A 클래스 , 🔻는 B클래스

@Entity
@Data
public class B {
	@Id
	@Column(name = "B_ID")
	private Long id;

	private String bb;
}

3.2. 대상 테이블 단방향

  • 일대일 관계 중 대상 테이블에 외래 키가 있는 단방향 관계는 JPA에서 지원하지 않음

3.3. 주 테이블 양방향

@Entity
@Data
public class A {
	@Id
	@Column(name = "A_ID")
	private Long id;

	@OneToOne
	@JoinColumn(name = "B_ID")
	private B b;

	private String aa;
}

-- 🔺는 A 클래스 , 🔻는 B클래스

@Entity
@Data
public class B {
	@Id
	@Column(name = "B_ID")
	private Long id;

	@OneToOne(mappedBy = "b")
	private A a;

	private String bb;
}

3.4. 대상 테이블 양방향

@Entity
@Data
public class A {
	@Id
	@Column(name = "A_ID")
	private Long id;

	@OneToOne(mappedBy = "a")
	private B b;

	private String aa;
}

-- 🔺는 A 클래스 , 🔻는 B클래스

@Entity
@Data
public class B {
	@Id
	@Column(name = "B_ID")
	private Long id;

	@OneToOne
	@JoinColumn(name = "A_ID")
	private A a;

	private String bb;
}

4. 다대다

  • RDB는 정규화된 Table 2개로 다대다 관계를 표현할 수 없다
    -> 그래서 보통 다대일, 일대다로 풀어내는 연결 테이블 사용


4.1. 단방향

@Entity
@Data
public class A {
	@Id
	@Column(name = "A_ID")
	private Long id;

	@ManyToMany
    @JointTable(name = "B",
    			joinColums = @JoinColumn(name = "A_ID"),
                inverseJoinColumns = @JoinColumn(name = "B_ID"))
	private List<B> b_list = new ArrayList<>();

	private String aa;
}

-- 🔺는 A 클래스 , 🔻는 B클래스

@Entity
@Data
public class B {
	@Id
	@Column(name = "B_ID")
	private Long id;

	private String bb;
}
  • @ManyToMany와 @JoinTable을 사용해서 연결 테이블을 바로 매핑
  • @JoinTable
    • name : 연결할 테이블 지정
    • joinColumns : 현재 방향인 A와 매핑할 조인 컬럼 정보 지정
    • inverseJoinColumns : 반대 방향인 B와 매핑할 조인 컬럼 정보 지정

4.2. 양방향

@Entity
@Data
public class A {
	@Id
	@Column(name = "A_ID")
	private Long id;

	@ManyToMany
    @JointTable(name = "B",
    			joinColums = @JoinColumn(name = "A_ID"),
                inverseJoinColumns = @JoinColumn(name = "B_ID"))
	private B b;

	private String aa;
}

-- 🔺는 A 클래스 , 🔻는 B클래스

@Entity
@Data
public class B {
	@Id
	@Column(name = "B_ID")
	private Long id;

	@ManyToMany(mappedBy = "a_list")
    private List<A> a_list = new ArrayList<>();

	private String bb;
}

4.3. 연결 엔티티 사용

  • @ManyToMany를 사용하면 연결 테이블을 자동 처리해주므로 도메인 모델이 단순
    -> 실무에서 사용하기에는 한계가 있음
  • 위 그림처럼 컬럼을 추가하면 @ManyToMany를 사용 ❌
    -> A or B Entity에는 추가한 컬럼을 매핑 ❌

💡 양방향으로 진행해야 함

4.4. 새로운 기본 키 사용

@Entity
@Data
public class AB {
	@Id
	@Column(name = "AB_ID")
	private Long id;

	@ManyToOne
    @JoinColumn(name = "A_ID")
	private A a;

	@ManyToOne
    @JoinColumn(name = "B_ID")
	private B b;
}
profile
Backend Developer

0개의 댓글