[JPA] κ° νμ
π λ€μ΄κ°λ©°
JPAμ λ°μ΄ν°λ ν¬κ² μν°ν° νμ κ³Ό κ° νμ μΌλ‘ λλλ€. μ΄λ² κΈμμλ κ° νμ (κΈ°λ³Έκ°Β·μλ² λλ·컬λ μ )μ μ 리νλ€.
| νμ | νΉμ§ |
|---|---|
| μν°ν° νμ | @Entity, μλ³μλ‘ μΆμ κ°λ₯ (λ³ν΄λ μΆμ ) |
| κ° νμ | μλ³μ μμ, λ³κ²½ μ μΆμ λΆκ° |
κ° νμ λΆλ₯:
1
2
3
4
κ° νμ
ββ κΈ°λ³Έκ° νμ
int, Integer, String
ββ μλ² λλ νμ
κΈ°λ³Έκ°μ λͺ¨μ λ³΅ν© νμ
(@Embeddable)
ββ 컬λ μ
κ° νμ
κ° νμ
μ μ¬λ¬ κ° (@ElementCollection)
1. κΈ°λ³Έκ° νμ
int,long,Stringμ²λΌ λ¨μν κ°μΌλ‘ μ°λ νμ . μλ³μκ° μμ΄ λ³κ²½ μ μΆμ λΆκ°νκ³ , μλͺ μ£ΌκΈ°κ° μν°ν°μ μμ‘΄νλ€.
β οΈ κ° νμ μ 곡μ νλ©΄ μ λλ€. κ° λ³΅μ¬(call by value)λ‘ λ€λ€μΌ μ¬μ΄λ μ΄ννΈκ° μλ€.
2. μλ² λλ νμ (@Embeddable)
κΈ°λ³Έκ° νμ μ λͺ¨μμ λ§λ λ³΅ν© νμ (μ: μ£Όμ = λμ+거리+μ°νΈλ²νΈ). μλ‘μ΄ κ° νμ μ μ¬μ©μ μ μλ‘ λ§λ λ€.
1
2
3
4
5
@Embeddable // κ° νμ
μ μνλ κ³³
public class Address { ... }
@Embedded // κ° νμ
μ¬μ©νλ κ³³
private Address address;
β οΈ κΈ°λ³Έ μμ±μ νμ. κ·Έλ¦¬κ³ μ¬λ¬ μν°ν°μμ 곡μ νλ©΄ μννλ€. μλ² λλ κ°μ΄ λ°λλ©΄ κ·Έκ²μ μ°Έμ‘°νλ λͺ¨λ μν°ν°μ κ°μ΄ ν¨κ» λ°λκΈ° λλ¬Έ. κ°μ κ°μ λ£κ³ μΆμΌλ©΄ μ μλ² λλλ₯Ό λ§λ€μ΄ κ° λ³΅μ¬νμ.
| μ₯μ | μ€λͺ |
|---|---|
| μ¬μ¬μ© | μ¬λ¬ μν°ν°μμ μ¬μ© |
| λμ μμ§λ | κ΄λ ¨ κ°μ νλλ‘ λ¬Άμ |
| μλ―Έ μλ λ©μλ | Period.isWork() κ°μ λ©μλ |
π‘ μλ² λλ νμ μ μ¨λ λ§€ν ν μ΄λΈμ κ·Έλλ‘λ€. ν΄λμ€λ§ μΈλ°νκ² λλ λΏμ΄λ€. (μ μ€κ³ν ORMμ ν μ΄λΈλ³΄λ€ ν΄λμ€ μκ° λ§λ€) κ°μ κ° νμ μ ν μν°ν°μμ μ¬λ¬ λ² μ°λ©΄ 컬λΌλͺ μ΄ μ€λ³΅λλ―λ‘
@AttributeOverrideλ‘ μ¬μ μνλ€.
3. λΆλ³ κ°μ²΄λ‘ λ§λ€κΈ°
β οΈ κ° νμ μ 곡μ μ¬κ³ λ₯Ό μμ² μ°¨λ¨νλ €λ©΄ λΆλ³ κ°μ²΄λ‘ λ§λ λ€. μμ±μλ‘λ§ κ°μ μ€μ νκ³ Setterλ₯Ό λ§λ€μ§ μμΌλ©΄ λλ€.
4. κ° νμ λΉκ΅
| λΉκ΅ | λ°©λ² | λμ |
|---|---|---|
| λμΌμ± | == | μ°Έμ‘°κ° λΉκ΅ |
| λλ±μ± | equals() | μΈμ€ν΄μ€ κ° λΉκ΅ |
π‘ κ° νμ μ
equals()λ₯Ό μ¬μ μν΄ λλ±μ± λΉκ΅νλ κ² μ’λ€. μ¬μ μ μ νλ μ§μ μ κ·Όλ³΄λ€ getterλ₯Ό μ°μ(νλ‘μ κ°μ²΄μΌ λ νλ μ§μ μ κ·Όμ΄ μ λκΈ° λλ¬Έ).
1
2
3
4
5
6
7
8
9
10
11
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Address a = (Address) o;
return Objects.equals(getCity(), a.getCity())
&& Objects.equals(getStreet(), a.getStreet())
&& Objects.equals(getZipcode(), a.getZipcode());
}
@Override
public int hashCode() { return Objects.hash(getCity(), getStreet(), getZipcode()); }
5. κ° νμ 컬λ μ
κ° νμ μ νλ μ΄μ μ μ₯ν λ
@ElementCollection,@CollectionTableμ μ΄λ€. DBλ 컬λ μ μ ν ν μ΄λΈμ λͺ» λ£μΌλ―λ‘ λ³λ ν μ΄λΈμ΄ νμνλ€.
π‘ 컬λ μ μ μμ μν°ν°κ° μλͺ μ£ΌκΈ°λ₯Ό μ νλ―λ‘, Cascade + κ³ μ κ°μ²΄ μ κ±°κ° ν¨κ» μλ κ²κ³Ό κ°λ€. μ§μ° λ‘λ©μ΄λ©°, μμ ν λλ μ κ°μ²΄λ‘ ν΅μ§Έλ‘ κ°μ λΌμμΌ νλ€.
1
2
3
4
// β
μ κ°μ²΄λ‘ κ΅μ²΄
findMember.setAddress(new Address("newCity", addr.getStreet(), addr.getZipcode()));
// β μ λ μ΄λ κ² νλ©΄ μ λ¨
findMember.getAddress().setCity("newCity");
β οΈ κ° νμ 컬λ μ μ μ μ½: μλ³μκ° μμ΄ λ³κ²½ μΆμ μ΄ μ΄λ ΅λ€. λ³κ²½μ΄ λ°μνλ©΄ μ°κ΄λ λ°μ΄ν°λ₯Ό μ λΆ μμ νκ³ νμ¬ κ°μ λͺ¨λ λ€μ μ μ₯νλ€(λΉν¨μ¨). κΈ°λ³Έν€λ λͺ¨λ 컬λΌμ λ¬Άμ΄ κ΅¬μ±(nullΒ·μ€λ³΅ λΆκ°).
1
2
3
4
-- νλ λ°κΏ¨λλ° μ λΆ μμ ν μ¬μ½μ
!
delete from ADDRESS where MEMBER_ID=?
insert into ADDRESS (...) values (...)
insert into ADDRESS (...) values (...)
λμ β μΌλλ€ κ΄κ³
π‘ μ€λ¬΄μμλ κ° νμ 컬λ μ λμ μΌλλ€(μν°ν°) κ΄κ³λ₯Ό κ³ λ €νλ€. κ° νμ μ μν°ν°λ‘ μΉκ²©μμΌ
@OneToMany+ Cascade + orphanRemovalλ‘ κ΄λ¦¬νλ€.
1
2
3
// Member
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
private List<AddressEntity> addressEntityList = new ArrayList<>();
π μ 리
1
2
3
4
5
6
JPA κ° νμ
ββ κΈ°λ³Έκ° int/String, μΆμ λΆκ°, 곡μ κΈμ§
ββ μλ² λλ @Embeddable/@Embedded, λΆλ³μΌλ‘ (Setter X)
ββ λΉκ΅ equals() μ¬μ μ (getter μ¬μ©)
ββ 컬λ μ
@ElementCollection, λ³κ²½ μ μ 체 μμ Β·μ¬μ½μ
ββ λμ μ€λ¬΄λ μΌλλ€ μν°ν° κ΄κ³
| κ°λ | ν μ€ μ μ |
|---|---|
| μλ² λλ νμ | κ°μ λͺ¨μ λ³΅ν© κ° νμ |
| λΆλ³ κ°μ²΄ | Setter μμ΄ μμ±μλ‘λ§ |
| κ° νμ 컬λ μ | λΉν¨μ¨μ (μ 체 μ¬μ½μ ) β μΌλλ€ κΆμ₯ |
κ° νμ μ ν΅μ¬μ β곡μ νμ§ λ§κ³ , λΆλ³μΌλ‘ λ§λ€λΌβλ€. νΉν κ° νμ 컬λ μ μ λ³κ²½ μ μ 체λ₯Ό μμ Β·μ¬μ½μ νλ λΉν¨μ¨μ΄ μμ΄, μ€λ¬΄μμλ μΌλλ€ μν°ν° κ΄κ³λ‘ νμ΄λ΄λ κ²μ΄ μ μμ΄λ€.
Comments powered by Disqus.