[JPA] λ€λμΌ, μΌλλ€, μΌλμΌ (λ¨λ°©ν₯, μλ°©ν₯) μ°κ΄κ΄κ³ λ§€ν
λ€μ€μ±κ³Ό λ¨λ°©ν₯, μλ°©ν₯μ κ³ λ €ν κ°λ₯ν λͺ¨λ μ°κ΄κ΄κ³λ₯Ό νλμ© μμλ³΄κ² μ΅λλ€. (μΌμͺ½μ΄ μ°κ΄κ΄κ³μ μ£ΌμΈ)
λ€λμΌ(N:1)
λ€λμΌ κ΄κ³ νΉμ§
- λ€λμΌ κ΄κ³μ λ°λ λ°©ν₯μ νμ μΌλλ€ κ΄κ³μ λλ€.
- μΌλλ€ κ΄κ³μ λ°λ λ°©ν₯μ νμ λ€λμΌ κ΄κ³μ λλ€.
- ν μ΄λΈμ λ€λμΌ, μΌλλ€ κ΄κ³μμ μΈλν€λ νμ λ€ μͺ½μ μμ΅λλ€.
λ€λμΌ λ¨λ°©ν₯ μλ°©ν₯ λ§€νμ μ΄ μ ν¬μ€ν μμ λ€λ£¨μμ§λ§, λ€μ ν λ² λ€λ£¨κ² μ΅λλ€.
[JPA] μ°κ΄κ΄κ³ λ§€ν - μλ°©ν₯ μ°κ΄κ΄κ³
λ°λ‘ μ΄μ ν¬μ€ν μμ λ¨λ°©ν₯ μ°κ΄κ΄κ³μ λν΄ μμ보μμ΅λλ€. λ¨λ°©ν₯ μ°κ΄κ΄κ³λ₯Ό κ°λ¨ν μ§κ³ λμ΄κ°μλ©΄, Member βΆοΈ Teamμ λ¨λ°©ν₯ μ°κ΄κ΄κ³λ₯Ό κ°μ§ λ Member μν°ν°μμλ Team μν°ν°λ₯Ό μ μ
rlaehddnd0422.tistory.com
λ€λμΌ λ¨λ°©ν₯ N β‘οΈ 1
Member (N) β‘οΈ Team (1)
Member Entity
@Entity
public class Member{
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
- @JoinColumnμΌλ‘ μ°Έμ‘°ν μΈλ ν€μ λ§€ν, μ¦ Memberκ° μ°κ΄κ΄κ³μ μ£ΌμΈμ΄λ©° νμ ν μ΄λΈμ TEAM_ID μΈλν€λ₯Ό κ΄λ¦¬ν©λλ€.
Team Entity
@Entity
public class Team{
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
}
- λ¨λ°©ν₯ μ°κ΄κ΄κ³μ΄λ―λ‘ @OneToMany μ¬μ©νμ¬ members νλλ₯Ό μ€μ νμ§ μμμ΅λλ€.
νμμ Member.teamμΌλ‘ ν μν°ν°λ₯Ό μ‘°νν μ μμ§λ§, λ°λλ‘ νμλ νμμ μ°Έμ‘°νλ νλκ° μλ λ¨λ°©ν₯ μ°κ΄κ΄κ³μ λλ€.
λ€λμΌ μλ°©ν₯ N ↔οΈ 1
Member (N) ↔οΈ Team (1) μλ°©ν₯ λ§€νμμλ νμ "λ€" μͺ½μ΄ μΈλν€λ₯Ό κ΄λ¦¬νλ μ°κ΄κ΄κ³μ μ£ΌμΈμ΄ λ©λλ€.
Member Entity
@Entity
public class Member{
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
- λ³κ²½μ X
Team Entity
@Entity
public class Team{
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<Member>();
public void addMember(Member member){
this.members.add(member);
if(member.getTeam() != this){
member.setTeam(this);
}
}
- @OneToManyλ‘ μλ°©ν₯ μ°κ΄κ΄κ³ λ§€ν + mappedBy μμ± μΆκ°
- νΈμλ©μλ addMember(member) λ‘ μλ°©ν₯ μλ λ§€ν μ€μ
μΌλλ€(1:N)
μΌλλ€ κ΄κ³λ λ€λμΌ κ΄κ³μ λ°λ λ°©ν₯μ λλ€. μΌλλ€ κ΄κ³λ μν°ν°λ₯Ό νλ μ΄μ μ°Έμ‘°ν μ μμΌλ―λ‘ μλ° μ»¬λ μ μΈ Collection, List, Set, Mapμ€μ νλλ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
μΌλλ€ λ¨λ°©ν₯ 1 β‘οΈ N
보ν΅μ μμ μ΄ λ§€νν ν μ΄λΈμ μΈλν€λ₯Ό κ΄λ¦¬νμ§λ§, μΌλλ€ κ΄κ³μμ "μΌ"μ΄ μΈλν€ κ΄λ¦¬μ, μ°κ΄κ΄κ³μ μ£ΌμΈμ΄ λλ €λ©΄ μΈλν€λ νμ "λ€" μͺ½μ μκΈ° λλ¬Έμ μ°Έμ‘° νλκ° μλ "λ€" ν μ΄λΈκ³Ό λ§€νμ ν΄μ£Όμ΄μΌ νλ νΉμ΄ν λͺ¨μ΅μ΄ λνλ©λλ€.
Team Entity
@Entity
public class Team{
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
@OneToMany
@JoinColumn(name = "TEAM_ID") // MEMBER ν
μ΄λΈμ TEAM_ID (FK)
private List<Member> members = new ArrayList<Member>();
Member Entity
@Entity
public class Member{
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
}
μΌλλ€ λ¨λ°©ν₯ κ΄κ³λ₯Ό λ§€νν λλ @JoinColumnμ λ°λμ λͺ μν΄μΌ ν©λλ€.
κ·Έλ μ§ μμΌλ©΄, JPAλ μ°κ²° ν μ΄λΈμ μ€κ°μ λκ³ μ°κ΄κ΄κ³λ₯Ό κ΄λ¦¬νλ μ‘°μΈ ν μ΄λΈ μ λ΅μ κΈ°λ³ΈμΌλ‘ μ¬μ©ν΄μ λ§€νν©λλ€.
μΌλλ€ λ¨λ°©ν₯ λ§€νμ λ¨μ
- λ§€νν κ°μ²΄κ³Ό κ΄λ¦¬νλ μΈλ ν€κ° λ€λ₯Έν μ΄λΈμ μμ΄ μ°κ΄κ΄κ³ μ²λ¦¬λ₯Ό μν UPDATE SQLμ μΆκ°μ μΌλ‘ μ€νν΄μΌ ν©λλ€.
- Team μν°ν°λ₯Ό μ μ₯ν λ Team.membersμ μ°Έμ‘° κ°μ νμΈν΄μ νμ ν μ΄λΈμ μλ TEAM_ID μΈλ ν€λ₯Ό μ λ°μ΄νΈν©λλ€.
- ν€ κ΄λ¦¬κ° 볡μ‘νκ³ λ¨μνμ§ μκΈ° λλ¬Έμ μΌλλ€ λ¨λ°©ν₯ λ§€ν보λ€λ λ€λμΌ μλ°©ν₯ λ§€νμ μ¬μ©ν©μλ€.
μΌλλ€ μλ°©ν₯ λ§€ν
μλ°©ν₯ λ§€νμμ @OneToManyλ μ°κ΄κ΄κ³μ μ£ΌμΈμ΄ λ μ μκΈ° λλ¬Έμ, μΌλλ€ μλ°©ν₯ λ§€νμ μ‘΄μ¬νμ§ μμ΅λλ€.
μΌλμΌ(1:1)
μΌλμΌ κ΄κ³λ μμͺ½μ΄ μλ‘ νλμ κ΄κ³λ§ κ°μ§λλ€. μλ₯Ό λ€μ΄ νμμ νλμ μ¬λ¬Όν¨λ§ μ¬μ©νκ³ μ¬λ¬Όν¨λ νλμ νμμ μν΄μλ§ μ¬μ©λ©λλ€.
νΉμ§
- μΌλμΌ κ΄κ³μ λ°λλ μΌλμΌ κ΄κ³.
- ν μ΄λΈ κ΄κ³μμ μΌλλ€, λ€λμΌμ νμ λ€μͺ½μ΄ μΈλν€λ₯Ό κ°μ§λλ€. νμ§λ§ μΌλμΌ κ΄κ³μμλ μ£Ό ν μ΄λΈμ΄λ λμ ν μ΄λΈ λ μ€ μ΄λκ³³μμλ μΈλν€λ₯Ό κ°μ§ μ μμ΅λλ€.
μ£Ό ν μ΄λΈμ μΈλν€ μ€μ
: μ£Ό κ°μ²΄κ° λμ κ°μ²΄λ₯Ό μ°Έμ‘°νλ κ²μ²λΌ μ£Ό ν μ΄λΈμ μΈλν€λ₯Ό λκ³ λμ ν μ΄λΈμ μ°Έμ‘°νλ λ°©μμ λλ€.
μΌλ°μ μΌλ‘ μ΄ λ°©μμ μ±νν©λλ€. JPAλ μ£Ό ν μ΄λΈμ μΈλ ν€κ° μμΌλ©΄ μ’ λ νΈλ¦¬νκ² λ§€νν μ μμ΅λλ€.
- Member - μ£Ό ν μ΄λΈ
- Locker - λμ ν μ΄λΈ
λ¨λ°©ν₯
μΌλμΌ κ΄κ³μ΄λ―λ‘ κ°μ²΄ λ§€νμ @OneToOneμ μ¬μ©ν΄ μ°κ΄κ΄κ³λ₯Ό λ§€νν΄μ€λλ€.
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
private String username;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}
@Entity
public class Locker{
@Id @GeneratedValue
@Column(name="LOCKER_ID")
private Long id;
private String name;
}
μλ°©ν₯
λ°λ λ°©ν₯μλ μΆκ°μ μΌλ‘ @OneToOneμ μ€μ ν΄μ€λλ€. λ¨, μλ°©ν₯ μ°κ΄κ΄κ³μ λμμ΄ λλ ν μ΄λΈμ΄λ―λ‘ λ€λμΌ μλ°©ν₯ μ°κ΄κ΄κ³ λ§€νκ³Ό λ§μ°¬κ°μ§λ‘ mappedBy μμ±μ μΆκ°ν΄μ£Όμ΄μΌν©λλ€.
// μ£Ό κ°μ²΄
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
private String username;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}
// λμ κ°μ²΄
@Entity
public class Locker{
@Id @GeneratedValue
@Column(name="LOCKER_ID")
private Long id;
private String name;
@OneToOne(mappedBy = "locker")
private Member member;
}
λμ ν μ΄λΈμ μΈλν€ μ€μ
μ΄λ²μλ λμ ν μ΄λΈμ μΈλ ν€κ° μλ μΌλμΌ κ΄κ³λ₯Ό μμλ³΄κ² μ΅λλ€.
λ¨λ°©ν₯
JPAμμ μΌλλ€ λ¨λ°©ν₯ κ΄κ³μ λμ ν μ΄λΈλ‘ μ°κ΄κ΄κ³λ₯Ό λ§€νμ μ§μνμ§λ§, λμ ν μ΄λΈμ μΈλν€κ° μλ μΌλμΌ λ¨λ°©ν₯ κ΄κ³λ λ§€νμ μ§μνμ§ μμ΅λλ€.
μ΄ λλ λ¨λ°©ν₯ κ΄κ³λ₯Ό μλμ κ°μ΄ Locker β‘οΈ Memberλ‘ μμ νκ±°λ, μλ°©ν₯ κ΄κ³λ‘ λ§λ€κ³ Lockerλ₯Ό μ°κ΄κ΄κ³μ μ£ΌμΈμΌλ‘ μ€μ ν΄μΌ ν©λλ€.
Locker β‘οΈ Memberλ‘ μμ
// μ£Ό κ°μ²΄
@Entity
public class Locker{
@Id @GeneratedValue
@Column(name="LOCKER_ID")
private Long id;
private String name;
@OneToOne
private Member member;
}
// λμ κ°μ²΄
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
private String username;
@OneToOne(mappedBy = "member")
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}
μλ°©ν₯ κ΄κ³λ‘ μμ
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
private String username;
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
}
@Entity
public class Locker{
@Id @GeneratedValue
@Column(name="LOCKER_ID")
private Long id;
private String name;
@OneToOne(mappedBy = "locker")
private Member member;
}
μλ°©ν₯
λμ ν μ΄λΈμ μΈλν€κ° μλ μλ°©ν₯ κ΄κ³λ₯Ό μμλ΄ μλ€.
// μ£Ό κ°μ²΄
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
private String username;
@OneToOne(mappedBy = "member")
private Locker locker;
}
// λμ κ°μ²΄
@Entity
public class Locker{
@Id @GeneratedValue
@Column(name="LOCKER_ID")
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
}
- μΌλμΌ λ§€νμμ λμ ν μ΄λΈμ μΈλν€λ₯Ό λκ³ μΆμΌλ©΄ μλ°©ν₯μΌλ‘ λ§€ννκ³ , λμ μν°ν°μΈ Lockerλ₯Ό μ°κ΄κ΄κ³μ μ£ΌμΈμΌλ‘ λ§λ€μ΄μ Locker ν μ΄λΈμ μΈλν€λ₯Ό κ΄λ¦¬νλλ‘ μ€μ νλ©΄ λ©λλ€.
<μ 리>
- λ€λμΌ, μΌλλ€, μΌλμΌ λ¨λ°©ν₯ μλ°©ν₯ μ°κ΄κ΄κ³μ λν΄ μμ보μμ΅λλ€.
- μΌλλ€ λ¨λ°©ν₯ κ΄κ³λ₯Ό λ§€νν λλ @JoinColumnμ λ°λμ λͺ μν΄μΌ ν©λλ€.
- μΌλμΌ λ§€νμμ μΈλν€λ μ£Ό ν μ΄λΈμλ λμ ν μ΄λΈμμλ κ΄λ¦¬ν μ μμ΅λλ€.
- JPAλ μΌλλ€ λ¨λ°©ν₯ λ§€νμ μ§μνμ§λ§, μΌλμΌ λ¨λ°©ν₯ λ§€νμ μ§μνμ§ μμ΅λλ€.
<μ°Έκ³ μλ£>