HyeLog
[κΉμν_μλ° ORM νμ€ JPA νλ‘κ·Έλλ° - κΈ°λ³ΈνΈ] 5. λ€μν μ°κ΄κ΄κ³ 맀ν λ³Έλ¬Έ
[κΉμν_μλ° ORM νμ€ JPA νλ‘κ·Έλλ° - κΈ°λ³ΈνΈ] 5. λ€μν μ°κ΄κ΄κ³ 맀ν
shj718 2022. 6. 12. 22:28π μ°κ΄κ΄κ³ 맀νμ κ³ λ €μ¬ν 3κ°μ§
- λ€μ€μ± (λ€λμΌ / μΌλλ€ / μΌλμΌ / λ€λλ€)
- λ¨λ°©ν₯ / μλ°©ν₯ (μ°Έμ‘°μ© νλκ° μλ μν°ν°λ‘λ§ μ°Έμ‘° κ°λ₯ → νμͺ½λ§ μ°Έμ‘°νλ©΄ λ¨λ°©ν₯, μμͺ½μ΄ μλ‘ μ°Έμ‘°νλ©΄ μλ°©ν₯)
- μ°κ΄κ΄κ³μ μ£ΌμΈ (μλ°©ν₯ 맀νμ)
λ€λμΌ λ¨λ°©ν₯ π¨π©π§π¦:π©
λ€λμΌ(@ManyToOne) λ¨λ°©ν₯μ κ°μ₯ λ§μ΄ μ¬μ©νλ μ°κ΄κ΄κ³μ΄λ€.
μμ) νμ : ν = N : 1 μΌ λ νμ μν°ν°μμλ§ νμ μ°Έμ‘°
@Entity
public class Member {
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
λ€λμΌ μλ°©ν₯ π¨π©π§π¦:π©
λ€λμΌ μλ°©ν₯μ λ€λμΌ λ¨λ°©ν₯μ κ°μ§ 맀νμ μΆκ°ν΄μ μμͺ½μ΄ μλ‘ μ°Έμ‘°ν μ μλλ‘ λ§λ κ²μ΄λ€.
μ΄λ DBμ μν₯μ μ£Όλ 'μ°κ΄κ΄κ³μ μ£ΌμΈ'μ DB κΈ°μ€ μΈλν€κ° μλ μͺ½μΈ 'λ€' μͺ½μ΄λ€.
μμ) μμ μμμ νμμλ νμμ μ°Έμ‘°ν μ μλλ‘ ν νλμ μλ μ½λ μΆκ°
@Entity
public class Team {
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
μΌλλ€ λ¨λ°©ν₯, μΌλλ€ μλ°©ν₯ π©:π¨π©π§π¦
- μΌλλ€ λ¨λ°©ν₯μ 'μΌ(1)'μͺ½μ΄ μ°κ΄κ΄κ³μ μ£ΌμΈμ΄ λλ λ°©λ²μ΄λ€. μ°Έκ³ λ‘ DB ν μ΄λΈμ νμ 'λ€(N)'μͺ½μ μΈλν€κ° μλ€.
κ·Έλμ μ΄ μ°κ΄κ΄κ³λ₯Ό μ¬μ©νλ©΄ ν ν μ΄λΈμ΄ νμ ν μ΄λΈμ μΈλν€λ₯Ό κ΄λ¦¬νλ νΉμ΄ν κ΅¬μ‘°κ° λ§λ€μ΄μ§λ€.
λ°λΌμ, μ¬μ©νμ§ μλ κ²μ κΆμ₯νλ€. μ΄λ° μ°κ΄κ΄κ³κ° νμν κ²½μ°(Ex. νμμ νμ μ ν κ΄μ¬μ΄ μκ³ νμμλ§ νμμ κ΄λ¦¬)μλ λ€λμΌ μλ°©ν₯ 맀νμ μ¬μ©νμ.
- μΌλλ€ μλ°©ν₯μ 곡μμ μΌλ‘ μ‘΄μ¬νμ§ μλλ€. λ€λμΌ μλ°©ν₯ 맀νμ μ¬μ©νμ.
μΌλμΌ λ¨λ°©ν₯ π©:π©
μΌλμΌ(@OneToOne) λ¨λ°©ν₯ μ°κ΄κ΄κ³λ DBμ λ ν μ΄λΈ μ€ μ£Όν μ΄λΈμ μΈλν€κ° μμ΄λ λκ³ , λμν μ΄λΈμ μΈλν€κ° μμ΄λ λλ μν©μ΄λ€.
λ€λμΌ(N:1)κ³Ό λΉμ·νμ§λ§, μΈλν€μ UNIQUE 쑰건μ μΆκ°ν΄μΌ νλ€.
μμ) νμ : μ¬λ¬Όν¨ = 1 : 1 → μ£Όν μ΄λΈ μν°ν°(νμ)μλ§ μ°Έμ‘°μ© νλ μμ±
μλ μ½λλ νμ μν°ν°(μ£Όν μ΄λΈ)μμ μ¬λ¬Όν¨(λμν μ΄λΈ)μ μ°Έμ‘°νλλ‘ μ€κ³ν κ²μ΄λ€.
@Entity
public class Member {
@OneToOne
@JoinColumn(name = "LOCKER_ID", unique=true)
private Locker locker;
μΌλμΌ μλ°©ν₯ π©:π©
μΌλμΌ μλ°©ν₯μ μμͺ½μ΄ μλ‘ μ°Έμ‘°ν μ μλ κ΄κ³μ΄λ€.
μμ μΌλμΌ λ¨λ°©ν₯ μμμμ μ¬λ¬Όν¨ μν°ν°μ νμ νλλ₯Ό μΆκ°νλ©΄ μλ°©ν₯μ΄ λλ€.
μΌλμΌ μλ°©ν₯μ λ€λμΌ μλ°©ν₯κ³Ό λ§μ°¬κ°μ§λ‘ μ°κ΄κ΄κ³μ μ£ΌμΈμ΄ μΈλν€κ° μλ μͺ½μ΄λ€. μ£ΌμΈμ΄ μλ μͺ½μ mappedByλ₯Ό μ μ©νλ€.
@Entity
public class Locker {
@OneToOne(mappedBy = "locker")
private Member member;
λ€λλ€ π¨π©π§π¦:π¨π©π§π¦
λ€λλ€(N:M) μ°κ΄κ΄κ³ 맀ν(@ManyToMany)μ μ€λ¬΄μμ μ¬μ©νμ§ μλλ€.
λμ , μ°κ²°ν μ΄λΈμ μν°ν°λ‘ λ§λ€λ©΄ λλ€.
μμ)
- MemberProduct (μ°κ²° ν μ΄λΈ)
@Entity
public class MemberProduct {
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
@ManyToOne
@JoinColumn(name = "PRODUCT_ID")
private Product product;
- Member
@Entity
public class Member {
@OneToMany(mappedBy = "member")
private List<MemberProduct> memberProducts = new ArrayList<>();
- Product
@Entity
public class Product {
@OneToMany(mappedBy = "product")
private List<MemberProduct> memberProducts = new ArrayList<>();
@JoinColumn
@ManyToOne, @OneToOneκ³Ό ν¨κ» μ¬μ©λλ @JoinColumnμ λν΄ νμ€ν μκ³ λμ΄κ°μ.
@JoinColumn(name = "[μΈλν€ μ΄λ¦]")
@JoinColumnμ name μμ±μ ν΄λΉ μν°ν°μμ μ°Έμ‘°νλ μΈλν€(FK) 컬λΌμ μ΄λ¦μ μ§μ νλ κ²μ΄λ€. μλ΅μ΄ κ°λ₯νλ©°, μλ΅ν κ²½μ° [νλλͺ _μ°Έμ‘°νλ ν μ΄λΈμ PK 컬λΌλͺ ]μΌλ‘ μλ μ€μ λλ€. μ€μ λ‘ μΈλν€κ° μ°Έμ‘°νλ ν μ΄λΈμ 컬λΌλͺ μ referencedColumnName μμ±μΌλ‘ μ§μ νλ€. μ΄ μμ μλ΅ κ°λ₯νλ©°, μλ΅ν κ²½μ° μ°Έμ‘°νλ ν μ΄λΈμ PKλ‘ μμμ μ²λ¦¬ν΄μ€λ€.
(μ°Έκ³ : https://hyeon9mak.github.io/omit-join-column-when-using-many-to-one/, https://boomrabbit.tistory.com/217)