κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μλ κ°μ²΄μ²λΌ μμμ΄λΌλ κ°λ μ΄ μμ΅λλ€.
κ·Έλλ§ μ μ¬ν κ°λ μΌλ‘λ μνΌνμ μλΈνμ κ΄κ³κ° μμ΅λλ€.
JPAμμλ κ°μ²΄μ μμ ꡬ쑰λ₯Ό DBμ μνΌνμ - μλΈνμ κ΄κ³μ 맀νμν΅λλ€.
μνΌνμ μλΈνμ λͺ¨λΈμ ꡬν λ°©λ²
1. κ°κ°μ ν μ΄λΈλ‘ λ³ν : μ‘°μΈ ν μ΄λΈ
λΆλͺ¨ νμ κ³Ό μμ νμ μ λͺ¨λ ν μ΄λΈλ‘ λ§λλλ€.
μ΄ν μμ νμ μ‘°ν μ μ‘°μΈμ ν΅ν΄ μ‘°ννλ λ°©μμΌλ‘ μ¬μ©ν©λλ€.
μ΄λ JPAμμ μ‘°μΈ ν μ΄λΈ μ λ΅μ΄λΌκ³ ν©λλ€.
2. ν΅ν© ν μ΄λΈλ‘ λ³ν : μ±κΈ ν μ΄λΈ
ν μ΄λΈμ λ¨ νλλ§ λ§λ ν, ν΄λΉ ν μ΄λΈμ λΆλͺ¨μ μμ±κ³Ό μμμ μμ±μ λͺ¨λ ν¬ν¨μμΌ μ¬μ©ν©λλ€.
μ΄λ JPAμμλ λ¨μΌ ν μ΄λΈ νΉμ μ±κΈ ν μ΄λΈ μ λ΅μ΄λΌκ³ ν©λλ€.
3. μλΈνμ ν μ΄λΈλ‘ λ³ν : ꡬν ν΄λμ€λ§λ€ ν μ΄λΈ
λΆλͺ¨ ν μ΄λΈμ λ§λ€μ§ μλ λ°©λ²μ λλ€.
μμ ν μ΄λΈ κ°κ°μ΄ λΆλͺ¨ νμ μ μμ±μ κ°κ² λ§λλ λ°©λ²μ΄λ€.
JPAμμλ ꡬν ν΄λμ€λ§λ€ ν μ΄λΈ( TABLE_PER_CLASS ) μ λ΅μ΄λΌκ³ ν©λλ€.
(μ¬μ©νμ§ μλκ²μ κΆμ₯ν©λλ€.)
μ‘°μΈ ν μ΄λΈ μ λ΅
@Inheritance(strategy = InheritanceType.JOINED)
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Item {
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
}
@Entity
public class Album extends Item {
private String artist;
}
@Entity
public class Book extends Item {
private String author;
private String isbn;
}
@Entity
public class Movie extends Item {
private String director;
private String actor;
}
κ²°κ³Ό
μμ μ½λλ μ μμ±λ κ² κ°μ§λ§ νκ°μ§ λ¬Έμ κ° μμ΅λλ€.
κ°μ²΄λ νμ μΌλ‘ ꡬλΆν μ μμ§λ§, ν μ΄λΈμ νμ μ΄ μμ΅λλ€.
λ°λΌμ νμ μ ꡬλΆνκΈ° μν΄ μ»¬λΌμ νλ μΆκ°ν΄ μ£Όμ΄μΌ νλ€.
κΈ°λ³Έμ μΌλ‘λ DTYPE μ΄λΌλ μ΄λ¦μ 컬λΌμ μ¬μ©ν©λλ€.
(@DiscreiminatorColumn μ ν΅ν΄ μ§μ ν μ μμ΅λλ€.)
λ°λ μ½λ
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn//κΈ°λ³Έκ°μ΄ DTYPE
public abstract class Item {
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item{
private String artist;
}
@Entity
@DiscriminatorValue("B")
public class Book extends Item{
private String author;
private String isbn;
}
@Entity
@DiscriminatorValue("M")
public class Movie extends Item{
private String director;
private String actor;
}
κ²°κ³Ό
μ‘°μΈ ν μ΄λΈ μ λ΅ μ 리
μ₯μ
- ν μ΄λΈμ΄ μ κ·νλ©λλ€.
- μΈλ ν€ μ°Έμ‘° λ¬΄κ²°μ± μ μ½μ‘°κ±΄μ νμ©ν μ μμ΅λλ€.(μΈλν€λ μ°Έμ‘°ν μ μλ κ°μ κ°μ§ μ μλ€λ κ·μΉ)
- μ μ₯곡κ°μ ν¨μ¨μ μΌλ‘ μ¬μ©ν©λλ€.
λ¨μ
- μ‘°νν λ μ‘°μΈμ΄ λ§μ΄ μ¬μ©λλ―λ‘ μ±λ₯μ΄ μ νλ μ μμ΅λλ€.
- μ‘°ν μΏΌλ¦¬κ° λ³΅μ‘ν©λλ€.
- λ°μ΄ν°λ₯Ό λ±λ‘ν λ INSERT SQLμ λ λ² μ€νν©λλ€.
λ¨μΌ ν μ΄λΈ μ λ΅
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
λ¨μΌ ν μ΄λΈ μ λ΅μ DTYPEμ λ°λμ μ§μ ν΄ μ£Όμ΄μΌ ν©λλ€.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn//κΈ°λ³Έκ°μ΄ DTYPE
public abstract class Item {
@Id @GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item{
private String artist;
}
@Entity
@DiscriminatorValue("B")
public class Book extends Item{
private String author;
private String isbn;
}
@Entity
@DiscriminatorValue("M")
public class Movie extends Item{
private String director;
private String actor;
}
κ²°κ³Ό
μ 리 : λ¨μΌ ν μ΄λΈ μ λ΅
μ₯μ
- μ‘°μΈμ΄ νμ μμΌλ―λ‘ μΌλ°μ μΌλ‘ μ‘°ν μ±λ₯μ΄ λΉ λ¦ λλ€.
- μ‘°ν μΏΌλ¦¬κ° λ¨μν©λλ€.
λ¨μ
- μμ μν°ν°κ° 맀νν 컬λΌμ λͺ¨λ nullμ νμ©ν΄μΌ ν©λλ€.
- λ¨μΌ ν μ΄λΈμ λͺ¨λ κ²μ μ μ₯νλ―λ‘ ν μ΄λΈμ΄ μ»€μ§ μ μμ΅λλ€. λ°λΌμ μν©μ λ°λΌμλ μ‘°ν μ±λ₯μ΄ μ€νλ € λλ €μ§ μ μμ΅λλ€.
νΉμ§
- κ΅¬λΆ μ»¬λΌ (DiscriminationColumn)μ κΌ μ¬μ©ν΄μΌ ν©λλ€.
- λ§μ½ μ¬μ©νμ§ μμΌλ©΄ κΈ°λ³Έ κ°μΌλ‘ DTYPEμ μμ μν°ν°μ μ΄λ¦μ μ¬μ©ν©λλ€.
ꡬν ν΄λμ€λ§λ€ ν μ΄λΈ μ λ΅
μ¬μ©νμ§ μλ κ²μ κΆμ₯ν©λλ€.
μ‘°ν μ λΆλͺ¨ ν΄λμ€ νμ μΌλ‘ μ‘°ννκ² λλ€λ©΄ union μΏΌλ¦¬κ° λ°μνκ² λ©λλ€.
κΆμ₯νλ λ°©λ²
κΈ°λ³Έμ μΌλ‘λ μ‘°μΈ ν μ΄λΈ μ λ΅μ μ¬μ©ν©λλ€.
ν μ΄λΈμ΄ μ λ§ λ¨μν κ²½μ°μλ λ¨μΌ ν μ΄λΈ μ λ΅μ μ¬μ©ν©λλ€.
Reference
[μλ° ORM νμ€ JPA νλ‘κ·Έλλ° - κΉμν]
'ποΈ Spring > JPA' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JPA] νλμ μ»¬λΌ λ§€ν - @Embedded (μλ² λλ νμ 맀ν) (0) | 2021.12.15 |
---|---|
[JPA] @MappedSuperclass (0) | 2021.12.15 |
[JPA] μ°κ΄κ΄κ³ 맀ννλ λ°©λ² (2) | 2021.12.15 |
[JPA] μ°κ΄κ΄κ³ νΈμ λ©μλ μμ±νκΈ° (0) | 2021.12.14 |
[JPA] - @JoinColumnκ³Ό μ°κ΄κ΄κ³μ μ£ΌμΈ (mappedBy) (2) | 2021.12.14 |