π Entity 맀ν / κΈ°λ³Έν€ λ§€ν
κ°μ²΄μ ν μ΄λΈ 맀ν μ΄λ Έν μ΄μ μ’ λ₯
@Entity
: JPAλ₯Ό μ¬μ©νμ¬ ν μ΄λΈκ³Ό 맀νν ν΄λμ€μ μμ±νλ μ΄λ Έν μ΄μ
@Entity(name="Blog")
- name : JPAμμ μ¬μ©ν μν°ν° μ΄λ¦μ μ§μ (κΈ°λ³Έκ° = ν΄λμ€ μ΄λ¦)
- μ£Όμμ¬ν : final, enum, interface, inner ν΄λμ€μλ μ¬μ© λΆκ°λ₯νλ€.
@Table
: μν°ν°μ 맀νν ν μ΄λΈμ μ§μ νλ μ΄λ Έν μ΄μ
*) λ°μ΄ν° λ² μ΄μ€ μ€ν€λ§ μλ μμ± : JPAλ λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§λ₯Ό μλμΌλ‘ μμ±νλ κΈ°λ₯μ μ§μνλ€.
#application.properties
spring.jpa.hibernate.ddl-auto=create
spring.jpa.hibernate.show-sql=true
@Id
: Id μ΄λ Έν μ΄μ μ ν΅ν΄ κΈ°λ³Έ ν€ λ§€ν κΈ°λ₯μ μ 곡νλ€.
: κΈ°λ³Έν€ μ‘°κ±΄ ( not null, unique, κ°λ³κ° x)
: IDENTITYλ₯Ό μ¬μ©νλ©΄ κΈ°λ³Έ ν€ μμ±μ λ°μ΄ν°λ² μ΄μ€μ μμνμ¬ μλμμ± ν μ μλ€.
π μ°κ΄κ΄κ³ 맀ν
N:1 (λ€λμΌ μ°κ΄κ΄κ³)
- Member(n) : Team(1)μ νλλ‘ κ°μ§λ μ°κ΄ κ΄κ³
λ¨λ°©ν₯
@Entity
public class Member {
@Id
@Column(name = "MEMBER_ID")
private String id;
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
public void setTeam(Team team) {
this.team = team;
}
...
}
@Entity
@Getter
public class Team {
@Id
@Column(name = "TEAM_ID")
private String id;
private String name;
...
}
μ μ½λλ₯Ό 보면 Memberμμ @manyToOne μ΄λ Έν μ΄μ μ ν΅ν΄ Teamκ³Ό λ¨λ°©ν₯μΌλ‘ μ°κ²°νκ²μ νμΈ ν μ μλ€.
Member → Team λ¨λ°©ν₯ μ°κ΄κ΄κ³λ‘ Memberμμ Teamμ μ‘°νν μλ μμ§λ§, Teamμμ Memberλ₯Ό μ‘°νν μλ μλ€.
@ManyToOne
: λ€λμΌκ΄κ³λ₯Ό λνλ΄λ 맀ν μ 보λ‘, μ°κ΄κ΄κ³ 맀νμ λνλ΄λ μ΄λ Έν μ΄μ μ νμλ‘ μ¬μ©νλ€.
: μ€μ μ΅μ
- fetch(κΈλ‘λ² νμΉ μ λ΅ μ€μ ) : ManyToOneμ κΈ°λ³Έκ°μ FetchType.EAGER(μ¦μλ‘λ©)
- cascade : μμμ± μ μ΄ κΈ°λ₯ μ€μ (@OneToMany μΌ κ²½μ° μ¬μ© νμ)
@JoinColumn(name = "TEAM_ID")
: μΈλν€ λ§€ν μ μ¬μ©, nameμμ±μ 맀ν ν μΈλν€ μ΄λ¦μ μ§μ ν¨
: Team ν΄λμ€μ ν΄λΉ μ΄λ Έν μ΄μ μ λΆμ¬μ λ°μ΄ν°λ² μ΄μ€μμ TEAM_IDλ₯Ό FKλ‘νμ¬ μ°κ΄κ΄κ³λ₯Ό λ§Ίμ
μλ°©ν₯
Team → Member λ‘ μ κ·Όνλ λ¨λ°©ν₯ κ΄κ³λ₯Ό μΆκ°νμ¬ μλ°©ν₯μΌλ‘ ꡬμ±νλ€.
μμμ μ€μ ν΄λ μΈλν€ νλλ‘ μλ°©ν₯ μ‘°νκ° κ°λ₯νλ―λ‘ DB λ³νλ μκ³ , κ°μ²΄μ 맀νλ§ μΆκ°νλ©΄ λλ€.
@Entity
@Getter
public class Team {
@Id
@Column(name = "TEAM_ID")
private String id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
@OneToMany
: μΌλλ€μ κ΄κ³λ₯Ό λνλ΄λ 맀νμ 보λ‘, μλ°©ν₯ μΌ λ mappedBy μμ±μ μ§μ νμ¬ μ°κ²°ν΄μ£Όμ΄μΌνλ€.
βοΈ mappedByκ° λλ° μ΄λ¨λ μ°λ건λ°
: μλ°©ν₯ μ°κ΄κ΄κ³ 맀ν μ μ§μΌμΌν κ·μΉ μ€ λ ν μ΄λΈ μ€ νλλ₯Ό μ°κ΄κ΄κ³μ λμ₯μΌλ‘ μ ν΄μΌνλ€.
: λμ₯μ μΈλν€λ₯Ό κ΄λ¦¬ νλ 주체(λ±λ‘, μμ , μμ )μ΄κ³ , λμ₯μ΄ μλκ²½μ° μ½κΈ°λ§ ν μ μλ€.
: μμμλ νμ ν μ΄λΈμ΄ μΈλν€λ₯Ό κ°μ§κ³ μμΌλ―λ‘, Teamμμ mappedBy="team"μμ±μ μ¬μ©νμ¬ λμ₯μ΄ μλμ μ€μ ν΄μΌνλ€.
π CASCADE(μμμ± μ μ΄)
: λΆλͺ¨ μν°ν°κ° μμν λ λ, μμ μν°ν°λ κ°μ΄ μμν λκ³ λΆλͺ¨ μν°ν°κ° μμ λ λ μμ μν°ν°λ μμ λλ λ±
: νΉμ μν°ν°λ₯Ό μμ μνλ‘ λ§λ€ λ μ°κ΄λ μν°ν°λ ν¨κ» μμ μνλ‘ μ μ΄λλ κ²μ μλ―Έν¨.
CascadeType.ALL: λͺ¨λ Cascadeλ₯Ό μ μ©
CascadeType.PERSIST: μν°ν°λ₯Ό μμνν λ, μ°κ΄λ μν°ν°λ ν¨κ» μ μ§
CascadeType.MERGE: μν°ν° μνλ₯Ό λ³ν©(Merge)ν λ, μ°κ΄λ μν°ν°λ λͺ¨λ λ³ν©
CascadeType.REMOVE: μν°ν°λ₯Ό μ κ±°ν λ, μ°κ΄λ μν°ν°λ λͺ¨λ μ κ±°
CascadeType.DETACH: λΆλͺ¨ μν°ν°λ₯Ό detach() μννλ©΄, μ°κ΄ μν°ν°λ detach()μνκ° λμ΄ λ³κ²½ λ°μ X CascadeType.REFRESH: μμ μν°ν°λ₯Ό μλ‘κ³ μΉ¨(Refresh)ν λ, μ°κ΄λ μν°ν°λ λͺ¨λ μλ‘κ³ μΉ¨
'π JPA' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λμμ± μ μ΄ Chap 2 | λΆμ°λ½ (0) | 2023.01.24 |
---|---|
λμμ± μ μ΄ Chap 1 | λΉκ΄μ λ½, λκ΄μ λ½ ? (0) | 2023.01.24 |
JPA | JPA With Native Query (0) | 2022.12.14 |