κ°μ²΄μ μ°Έμ‘°μ ν μ΄λΈμ μΈλν€λ₯Ό λ§€ννλ κ²
β JPAμμλ μ°κ΄ κ΄κ³μ μλ μλ ν μ΄λΈμ PKλ₯Ό λ©€λ² λ³μλ‘ κ°μ§ μκ³ , μν°ν° κ°μ²΄ μ체λ₯Ό ν΅μ§Έλ‘ μ°Έμ‘°νλ€.
κ°μ²΄ κ°μ κ΄κ³κ° μμ κ²½μ°, κ°μ²΄λ₯Ό μ°Έμ‘°νμ¬ μ°κ΄λ λ΄μ©λ€μ νμΈν μ μλ€. ν μ΄λΈμ μ μ₯μμλ μ°κ΄ κ΄κ³λ₯Ό ν΅ν΄ λΆνμν μΉΌλΌμ μμ±νμ§ μμλ λλ€.
μλ₯Ό λ€μ΄, Team Entityμ Member Entityκ° μ°κ΄ κ΄κ³μ μλ€κ³ νλ€λ©΄ Member κ°μ²΄μ μ°κ΄λ Teamμ μ 보λ₯Ό νμΈν μ μλ€.
β½ λ°©ν₯ : λ¨λ°©ν₯, μλ°©ν₯ (κ°μ²΄ κ°μ μ°Έμ‘°)
β½ μ°κ΄ κ΄κ³μ μ£ΌμΈ : μλ°©ν₯μΌ λ μ°κ΄ κ΄κ³μμ κ΄λ¦¬μ μ£Όμ²΄κ° λλ κ³³
β½ λ€μ€μ± : μΌλμΌ, μΌλλ€, λ€λμΌ, λ€λλ€
λ Entityκ° κ΄κ³λ₯Ό λ§Ίμ λ, ν μͺ½μ Entityλ§ μ°Έμ‘°νκ³ μλ κ²μ μλ―Έ
[κ°μ²΄ μ°κ΄ κ΄κ³]
β½ νμ κ°μ²΄(Member)λ Member.team νλ(λ©€λ² λ³μ)λ‘ ν κ°μ²΄μ μ°κ΄ κ΄κ³
β½ νμ κ°μ²΄μ ν κ°μ²΄λ λ¨λ°©ν₯ κ΄κ³
β½ νμμ Member.team νλλ₯Ό ν΅ν΄ νμ μ μ μμ§λ§, ν κ°μ²΄λ‘ μμλ νμλ€μ μ μ μκΈ° λλ¬Έμ΄λ€
β½ member β‘ teamμ μ‘°νλ member.getTeam()
μΌλ‘ κ°λ₯νμ§λ§, team β‘ memberλ₯Ό μ κ·Όνλ νλλ μλ€
[ν
μ΄λΈ μ°κ΄κ΄κ³]
β½ νμ ν
μ΄λΈμ TEAM_ID μΈλν€(FK)λ‘ ν ν
μ΄λΈκ³Ό μ°κ΄κ΄κ³
β½ νμ ν
μ΄λΈκ³Ό ν ν
μ΄λΈμ μλ°©ν₯ κ΄κ³
β½ νμ ν
μ΄λΈμ TEAM_ID μΈλν€λ₯Ό ν΅ν΄μ νμκ³Ό νμ μ‘°μΈν μ μκ³ , λ°λλ‘ νκ³Ό νμλ μ‘°μΈν μ μλ€
β½ MEMBER ν
μ΄λΈμ TEAM_ID μΈλν€ νλλ‘ MEMBER JOIN TEAMκ³Ό TEAM JOIN MEMBER λ λ€ κ°λ₯νλ€
//νμκ³Ό νμ μ‘°μΈνλ SQL
SELECT * FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
//νκ³Ό νμμ μ‘°μΈνλ SQL
SELECT * FROM TEAM T
JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID
π κ°μ²΄ μ°κ΄ κ΄κ³μ ν
μ΄λΈ μ°κ΄ κ΄κ³μ μ°¨μ΄μ
β½ κ°μ²΄λ μ°Έμ‘°λ‘ μ°κ΄ κ΄κ³λ₯Ό λ§Ίκ³ , ν
μ΄λΈμ μΈλν€λ‘ μ°κ΄ κ΄κ³λ₯Ό λ§Ίλλ€
β½ μ°Έμ‘°λ₯Ό μ¬μ©νλ κ°μ²΄μ μ°κ΄ κ΄κ³λ λ¨λ°©ν₯μ΄λ€
-> κ°μ²΄κ°μ μ°κ΄ κ΄κ³λ₯Ό μλ°©ν₯μΌλ‘ λ§λ€κ³ μΆμΌλ©΄ λ°λμͺ½μλ νλλ₯Ό μΆκ°ν΄μ μ°Έμ‘°λ₯Ό 보κ΄ν΄μΌ νλ€. μ΄λ κ² μμͺ½μμ λ¨λ°©ν₯ μ°κ΄ κ΄κ³ λ§€νμ ν΅ν΄ μλ°©ν₯ μ°κ΄ κ΄κ³λ₯Ό λ§Ίλλ€
β½ μΈλν€λ₯Ό μ¬μ©νλ ν
μ΄λΈμ μ°κ΄ κ΄κ³λ μλ°©ν₯μ΄λ€
-> ν
μ΄λΈμ μΈλν€ νλλ‘ μ‘°μΈμ μ¬μ©ν΄μ μλ°©ν₯μΌλ‘ μΏΌλ¦¬κ° κ°λ₯νλ―λ‘ μ¬μ€μ λ°©ν₯μ΄λΌλ κ°λ
μ΄ μλ€. λ κ°μ²΄κ° λ¨λ°©ν₯ μ°Έμ‘°λ₯Ό κ°κ° κ°μ Έμ μλ°©ν₯ κ΄κ³μ²λΌ μ¬μ©νλ κ²μ΄λ€
λ Entityκ° κ΄κ³λ₯Ό λ§Ίμ λ, μ μͺ½μ΄ μλ‘ μ°Έμ‘°νκ³ μλ κ²μ μλ―Έ
-> μλ‘ λ¨λ°©ν₯ μ°κ΄ κ΄κ³ λ§€νμ ν΅ν΄ μλ°©ν₯ μ°κ΄ κ΄κ³λ₯Ό λ§Ίλλ€
π 무쑰건 μλ°©ν₯ κ΄κ³λ₯Ό νλ©΄ μ½μ§ μλβ
β κ°μ²΄ μ
μ₯μμ μλ°©ν₯ λ§€νμ νμ λ μ€νλ € 볡μ‘ν΄μ§ μ μλ€
μλ₯Ό λ€μ΄, μΌλ°μ μΈ λΉμ¦λμ€ μ ν리μΌμ΄μ
μμ μ¬μ©μ(User) μν°ν°λ κ΅μ₯ν λ§μ μν°ν°μ μ°κ΄ κ΄κ³λ₯Ό κ°λλ€. μ΄λ° κ²½μ°μ λͺ¨λ μν°ν°λ₯Ό μλ°©ν₯ κ΄κ³λ‘ μ€μ νκ² λλ©΄ μ¬μ©μ(User) μν°ν°λ μμ²λκ² λ§μ ν
μ΄λΈκ³Ό μ°κ΄ κ΄κ³λ₯Ό λ§Ίκ² λκ³ User ν΄λμ€κ° 볡μ‘ν΄μ§λ€. κ·Έλ¦¬κ³ λ€λ₯Έ μν°ν°λ€λ λΆνμν μ°κ΄ κ΄κ³ λ§€νμΌλ‘ μΈν΄ 볡μ‘μ±μ΄ μ¦κ°ν μ μλ€. κ·Έλμ μλ°©ν₯μΌλ‘ ν μ§ λ¨λ°©ν₯μΌλ‘ ν μ§ κ΅¬λΆν΄μ€μΌ νλ€. ꡬλΆνκΈ° μ’μ κΈ°μ€μ κΈ°λ³Έμ μΌλ‘ λ¨λ°©ν₯ λ§€νμΌλ‘ νκ³ λμ€μ μλ°©ν₯μΌλ‘ κ°μ²΄ νμμ΄ κΌ νμνλ€κ³ λλ λ μΆκ°νλ κ²μ΄ μ’λ€κ³ νλ€.
β½ λ κ°μ²΄(A, B)κ° μλ°©ν₯ κ΄κ³, λ€μ λ§ν΄ λ¨λ°©ν₯ κ΄κ³ 2κ°(AβB, BβA)λ₯Ό λ§Ίμ λ, μ°κ΄ κ΄κ³μ μ£ΌμΈμ μ§μ ν΄μΌ νλ€
β½ μ°κ΄ κ΄κ³μ μ£ΌμΈμ μ§μ νλ κ²μ λ λ¨λ°©ν₯ κ΄κ³(AβB, BβA)μ€, μ μ΄μ κΆν(μΈλ ν€λ₯Ό λΉλ‘―ν ν
μ΄λΈ λ μ½λλ₯Ό μ μ₯, μμ , μμ μ²λ¦¬)μ κ°λ μ€μ§μ μΈ κ΄κ³κ° μ΄λ€ κ²μΈμ§ JPAμκ² μλ €μ£Όλ κ²
β½ μ°κ΄ κ΄κ³μ μ£ΌμΈμ μ°κ΄ κ΄κ³λ₯Ό κ°λ λ κ°μ²΄ μ¬μ΄μμ μ‘°ν, μ μ₯, μμ , μμ λ₯Ό ν μ μμ§λ§, μ°κ΄ κ΄κ³μ μ£ΌμΈμ΄ μλλ©΄ μ‘°νλ§ κ°λ₯νλ€.
β½ μ°κ΄ κ΄κ³μ μ£ΌμΈμ΄ μλ κ°μ²΄μμ mappedBy
μμ±μ μ¬μ©ν΄μ μ£ΌμΈμ μ§μ ν΄μ€μΌ νλ€.
β½ μΈλν€κ° μλ κ³³μ μ°κ΄ κ΄κ³μ μ£ΌμΈμΌλ‘ μ νλ©΄ λλ€κ³ νλ€β
λ°μ΄ν°λ² μ΄μ€λ₯Ό κΈ°μ€μΌλ‘ λ€μ€μ±μ κ²°μ
μ°κ΄ κ΄κ³λ λμΉμ±μ κ°λλ€
β½ μΌλλ€ β λ€λμΌ
β½ μΌλμΌ β μΌλμΌ
β½ λ€λλ€ β λ€λλ€
π λ€λμΌ(N:1) λ¨λ°©ν₯
π Member ν΄λμ€ (λ€λμΌμμ λ€μ ν΄λΉ)
@Entity
public class Member {
@Id
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
//Getter, Setter, Constructor...
}
π Team ν΄λμ€ (λ€λμΌμμ μΌμ ν΄λΉ)
@Entity
public class Team {
@Id
@Column(name = "TEAM_ID")
private Long id;
@Column(name = "NAME")
private String name;
//Getter, Setter, Constructor
}
β λ€λμΌ λ¨λ°©ν₯ λ§€νμμλ λ€(N)μ ν΄λΉνλ ν΄λμ€μ μΌ(1)μ ν΄λΉνλ ν΄λμ€λ₯Ό μ°Έμ‘° νλλ‘ μμ±νλ©΄ λλ€
β μ΄λ, ν΄λΉ μ°Έμ‘° νλ μμ @ManyToOne
κ³Ό @JoinColumn(name = "μΈλν€ μ΄λ¦")
μ μΆκ°νλ€
@ManyToOne
: λ€λμΌ(N:1) κ΄κ³λΌλ λ§€ν μ 보μ΄λ€. μ°κ΄κ΄κ³λ₯Ό λ§€νν λ λ€μ€μ±μ λνλ΄λ μ΄λ
Έν
μ΄μ
μ νμλ‘ μ¬μ©
@JoinColumn
: μΈλν€λ₯Ό λ§€νν λ μ¬μ©νκ³ , name μμ±μλ λ§€νν μΈλν€ μ΄λ¦μ μ§μ νλ€. μ΄ μ΄λ
Έν
μ΄μ
μ μλ΅μ΄ κ°λ₯νκ³ , μλ΅νλ©΄ μΈλν€λ₯Ό μ°Ύμ λ κΈ°λ³Έ μ λ΅μ μ¬μ©νλ€
π λ€λμΌ(N:1) μλ°©ν₯
π Member ν΄λμ€ (λ€λμΌμμ λ€μ ν΄λΉ)
@Entity
public class Member {
@Id
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
//Getter, Setter, Constructor...
}
π Team ν΄λμ€ (λ€λμΌμμ μΌμ ν΄λΉ)
@Entity
public class Team {
@Id
@Column(name = "TEAM_ID)
private Long id;
@Column(name = "NAME")
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
//NPE λ°©μ§λ₯Ό μν΄μ, Collection κ°μ²΄λ₯Ό μ΄κΈ°ν νλ€
//NPE : Null Pointer Exception
//Getter, Setter, Constructor
}
β λ€λμΌ μλ°©ν₯ λ§€νμμ λ€(N)μ μνλ Member ν΄λμ€λ λ€λμΌ λ¨λ°©ν₯ λ§€νμ μ½λμ λμΌνλ€
β λ€λμΌ μλ°©ν₯μΌλ‘ λ§λλ €λ©΄ μΌ(1) μͺ½μ @OneToMany
λ₯Ό μΆκ°νκ³ μλ°©ν₯ λ§€νμ μ¬μ©νμΌλ μ°κ΄κ΄κ³μ μ£ΌμΈμ΄ μλκ³ , μ΄λμ λ§€ν λλμ§μ κ΄ν μ 보 mappedBy
λ₯Ό λ£μ΄μ€μΌ νλ€.
β mappedBy
λ‘ μ§μ ν λ κ°μ λμμ΄ λλ λ³μλͺ
μ λ°λΌ μ§μ νλ©΄ λλ€.
π μΌλλ€(1:N) λ¨λ°©ν₯
βΎ μΌλλ€(1:N) κ΄κ³λ λ€λμΌ κ΄κ³μ λ°λ λ°©ν₯
βΎ μΌ(1)μ΄ μΈλν€λ₯Ό κ΄λ¦¬νλ©°, μ°κ΄ κ΄κ³μ μ£ΌμΈ
π Team ν΄λμ€ (μΌλλ€μμ μΌμ ν΄λΉ)
@Entity
public class Team {
@Id
@Column(name = "TEAM_ID")
private Long id;
@Column(name = "NAME")
private String name;
@OneToMany
@JoinColumn(name = "TEAM_ID") //MEMBER ν
μ΄λΈμ TEAM_ID (FK)
pricate List<Member> members = new ArrayList<>();
//Getter, Setter, Constructor, ...
}
π Member ν΄λμ€ (μΌλλ€μμ λ€μ ν΄λΉ)
@Entity
public class Member {
@Id
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String username;
//Getter, Setter, Constructor
}
β μΌ(1)μ @OneToMany
μ @JoinColumn(name = "μΈλν€ μ΄λ¦")
μ μΆκ°νλ€
β μΌλλ€ λ¨λ°©ν₯ κ΄κ³λ₯Ό λ§€νν λλ @JoinColumn
μ λͺ
μν΄μΌ νλ€. κ·Έλ μ§ μμΌλ©΄ JPAλ μ°κ²° ν
μ΄λΈμ μ€κ°μ μμ±νκ³ , μ°κ΄ κ΄κ³λ₯Ό κ΄λ¦¬νλ μ‘°μΈ ν
μ΄λΈ μ λ΅μ κΈ°λ³ΈμΌλ‘ μ¬μ©νμ¬ λ§€ννλ€
μΌλλ€ λ¨λ°©ν₯ λ§€νμ λ¨μ : λ§€νν κ°μ²΄κ° κ΄λ¦¬νλ μΈλ ν€κ° λ€λ₯Έ ν
μ΄λΈμ μλ€. λ³ΈμΈ ν
μ΄λΈμ μΈλν€κ° μμΌλ©΄ μν°ν°μ μ μ₯κ³Ό μ°κ΄ κ΄κ³ μ²λ¦¬λ₯Ό INSERT SQL ν λ²μΌλ‘ λλΌ μ μμ§λ§, κ·Έλ μ§ μλ€λ©΄ μ°κ΄ κ΄κ³ μ²λ¦¬λ₯Ό μν UPDATE SQLμ μΆκ°λ‘ μ€νν΄μΌ νλ€.
-> μΌλλ€ λ¨λ°©ν₯ μ°κ΄ κ΄κ³ λ§€νμ΄ νμν κ²½μ°μλ λ€λμΌ μλ°©ν₯ μ°κ΄ κ΄κ³ λ§€νμ νλκ² μΆν μ μ§λ³΄μν λ ν¨μ¬ μμνλ€
@OneToMany
: μΌλλ€ κ΄κ³μμ μ¬μ©
π μΌλλ€(1:N) μλ°©ν₯
곡μμ μΌλ‘ μ‘΄μ¬νμ§ μκ³ , μ€λ¬΄ μ¬μ© κΈμ§ β
β μΌλμΌ(1:1) κ΄κ³λ μ£Ό ν μ΄λΈμ΄λ λμ ν μ΄λΈ λ μ€ μ΄λ κ³³μ΄λ μΈλν€λ₯Ό κ°μ§ μ μλ€
μ£Ό ν μ΄λΈμ μΈλν€ μ μ₯ : κ°μ²΄μ§ν₯ κ°λ°μλ€μ΄ μ νΈνλ λ°©μμΌλ‘, μ£Ό κ°μ²΄κ° λμ κ°μ²΄λ₯Ό μ°Έμ‘°νλ κ²μ²λΌ μ£Ό ν μ΄λΈμ μΈλ ν€λ₯Ό λκ³ λμ ν μ΄λΈμ μ°Έμ‘°νλ€. μ£Ό ν μ΄λΈμ΄ μΈλ ν€λ₯Ό κ°μ§κ³ μμΌλ―λ‘ μ£Ό ν μ΄λΈλ§ νμΈν΄λ λμ ν μ΄λΈκ³Ό μ°κ΄κ΄κ³κ° μλμ§ μ μ μλ€.
λμ ν μ΄λΈμ μΈλν€ μ μ₯ : λ°μ΄ν°λ² μ΄μ€ κ°λ°μλ€μ΄ μ νΈνλ λ°©μμΌλ‘, ν μ΄λΈ κ΄κ³λ₯Ό μΌλμΌ(1:1)μμ μΌλλ€(1:N)μΌλ‘ λ³κ²½ν λ, ν μ΄λΈ ꡬ쑰λ₯Ό κ·Έλλ‘ μ μ§ν μ μλ€.
π μ£Ό ν μ΄λΈμ μΈλν€, μΌλμΌ(1:1) λ¨λ°©ν₯
π Member ν΄λμ€ (μΌλμΌμμ μ£Ό ν μ΄λΈμ ν΄λΉ)
public class Member {
@Id
@Column(name = "MEMBER_ID")
private Long id;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
@Column(name = "USERNAME")
private String username;
//Getter, Setter, Constructor
}
π Locker ν΄λμ€ (μΌλμΌμμ λμ ν μ΄λΈμ ν΄λΉ)
public class Locker {
@Id
@Column(name = "LOCKER_ID")
private Long id;
@Column(name = "NAME")
private String name;
//Getter, Setter, Constructor
}
β μ£Ό ν
μ΄λΈμ μΈλν€λ₯Ό μ μ₯νλ λ¨λ°©ν₯ κ΄κ³μΌ κ²½μ°, μ£Ό ν
μ΄λΈμ ν΄λΉνλ ν΄λμ€μ λμ ν
μ΄λΈμ ν΄λΉνλ ν΄λμ€λ₯Ό μ°Έμ‘° νλλ‘ μμ±νλ€
β μ΄λ, ν΄λΉ μ°Έμ‘° νλ μμ @OneToOne
κ³Ό @JoinColumn(name = "μΈλν€ μ΄λ¦")
μ μΆκ°νλ€
@OneToOne
: μΌλμΌ κ΄κ³λ μμͺ½μ΄ μλ‘ νλμ κ΄κ³λ§ κ°μ§λ€
π μ£Ό ν
μ΄λΈμ μΈλν€, μΌλμΌ(1:1) μλ°©ν₯
π Member ν΄λμ€ (μΌλμΌμμ μ£Ό ν μ΄λΈμ ν΄λΉ)
public class Member {
@Id
@Column(name = "MEMBER_ID")
private Long id;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
@Column(name = "USERNAME")
private String username;
//μμν κ°μ²΄λ₯Ό κ³ λ €ν μ°κ΄κ΄κ³ νΈμ λ©μλ
public void setLocker(Locker locker) {
if (this.locker != null) {
this.locker.setMember(null);
}
this.locker = locker;
if (locker != null) {
locker.setMember(this);
}
}
//Getter, Setter, Constructor
}
π Locker ν΄λμ€ (μΌλμΌμμ λμ ν μ΄λΈμ ν΄λΉ)
public class Locker {
@Id
@Column(name = "LOCKER_ID")
private Long id;
@Column(name = "NAME")
private String name;
@OneToOne(mappedBy = "locker")
private Member member;
//Getter, Setter, Constructor
}
β μ£Ό ν
μ΄λΈμ μΈλν€λ₯Ό μ μ₯νλ μλ°©ν₯ κ΄κ³μΌ κ²½μ°, μ£Ό ν
μ΄λΈμ ν΄λΉνλ ν΄λμ€λ μ£Ό ν
μ΄λΈμ μΈλν€λ₯Ό μ μ₯νλ λ¨λ°©ν₯ κ΄κ³μ λμΌνλ€
β λμ ν
μ΄λΈμ ν΄λΉνλ ν΄λμ€μ μ£Ό ν
μ΄λΈμ ν΄λΉνλ ν΄λμ€λ₯Ό μ°Έμ‘° νλλ‘ μμ±νλ€
β μ΄λ, ν΄λΉ νλμμ @OneToOne(mappedBy = "λ°λμͺ½ λ§€νμ νλ μ΄λ¦κ°")
μ μΆκ°νλ€
mappedBy
: μλ°©ν₯ λ§€νμΌ λ μ¬μ©νλ©°, λ°λμͺ½ λ§€νμ νλ μ΄λ¦κ°μΌλ‘ μ€μ νλ€. μ΄λ μ°κ΄κ΄κ³μ μ£ΌμΈμ μ€μ νκΈ° μν κ²μ΄λ€
π λμ ν
μ΄λΈμ μΈλν€, μΌλμΌ(1:1) λ¨λ°©ν₯
μ΄λ° μ°κ΄κ΄κ³λ JPAμμ μ§μνμ§ μλλ€ β
π λμ ν
μ΄λΈμ μΈλν€, μΌλμΌ(1:1) μλ°©ν₯
β ν μ΄λΈ μ°κ΄κ΄κ³μμ λμ ν μ΄λΈμ μ μ₯λ μΈλν€μ UNIQUE μ μ½μ‘°κ±΄μ΄ μΆκ°λ κ²μ νμΈν μ μλ€
π Member ν΄λμ€ (μΌλμΌμμ μ£Ό ν μ΄λΈμ ν΄λΉ)
public class Member {
@Id
@Column(name = "MEMBER_ID")
private Long id;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
@Column(name = "USERNAME")
private String username;
//Getter, Setter, Constructor
}
π Locker ν΄λμ€ (μΌλμΌμμ λμ ν μ΄λΈμ ν΄λΉ)
public class Locker {
@Id
@Column(name = "LOCKER_ID")
private Long id;
@Column(name = "NAME")
private String name;
@OneToOne(mappedBy = "locker")
private Member member;
//μμν κ°μ²΄λ₯Ό κ³ λ €ν μ°κ΄κ΄κ³ νΈμ λ©μλ
public void setMember(Member member) {
if (this.member != null) {
this.member.setLocker(null);
}
this.member = member;
if (member != null) {
member.setLocker(this);
}
}
//Getter, Setter, Constructor
}
β λμ ν μ΄λΈμ μΈλν€λ₯Ό μ μ₯νλ μλ°©ν₯ κ΄κ³μΌ κ²½μ°, μ£Ό ν μ΄λΈμ μΈλν€λ₯Ό μ μ₯νλ μλ°©ν₯ κ΄κ³μΌ κ²½μ°μ λ°λλ‘ μ½λλ₯Ό μμ±νλ©΄ λλ€
JPAμμ @ManyToMany
λ₯Ό ν΅ν΄ λ€λλ€ μ°κ΄κ΄κ³λ₯Ό μ 곡νμ§λ§, μ¬μ©νμ§ μλ κ²μ μΆμ² β
β½ μ€κ° ν
μ΄λΈμ΄ μ¨κ²¨μ Έ μκΈ° λλ¬Έμ μκΈ°λ λͺ¨λ₯΄λ 볡μ‘ν μ‘°μΈμ 쿼리(Query)κ° λ°μνλ κ²½μ°κ° μκΈΈ μ μκΈ° λλ¬Έμ΄λ€.
β½ λ€λλ€λ‘ μλμμ±λ μ€κ°ν
μ΄λΈμ λ κ°μ²΄μ ν
μ΄λΈμ μΈλν€λ§ μ μ₯λκΈ° λλ¬Έμ λ¬Έμ κ° λ νλ₯ μ΄ λλ€. JPAλ₯Ό ν΄λ³΄λ©΄ μ€κ° ν
μ΄λΈμ μΈλν€ μΈμ λ€λ₯Έ μ λ³΄κ° λ€μ΄κ°λ κ²½μ°κ° λ§κΈ° λλ¬Έμ λ€λλ€λ₯Ό μΌλλ€, λ€λμΌλ‘ νμ΄μ λ§λλ κ²(μ€κ° ν
μ΄λΈμ Entityλ‘ λ§λλ κ²)μ΄ μΆν λ³κ²½μλ μ μ°νκ² λμ²ν μ μλ€.
β λ€λλ€ μ°κ΄ κ΄κ³λ₯Ό κ°μ²΄λ‘ νννκΈ° μν΄μλ μ°κ²° ν μ΄λΈμ© μν°ν°λ₯Ό μΆκ°νμ¬ μΌλλ€, λ€λμΌ κ΄κ³λ‘ νμ΄λ΄μΌ νλ€.
π @ManyToMany
β @OneToMany
, @ManyToOne
@Entity
public class Member {
@Id @Column(name = "MEMBER_ID")
private String id;
@OneToMany(mappedBy = "product")
private List<Order> orders;
}
@Entity //μ°κ²° ν
μ΄λΈμ© μν°ν°(Order)
public class Order {
@Id
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
@Id
@ManyToOne
@JoinColumn(name = "PRODUCT_ID")
private Product product;
}
@Entity
public class Product {
@Id @Column(name = "PRODUCT_ID")
private String id;
@OneToMany(mappedBy = "product")
private List<Member> members;
}