1οΈβ£ μν°ν° λ§€λμ ν©ν 리μ μν°ν° λ§€λμ

β μν°ν° λ§€λμ ν©ν 리
// μν°ν° λ§€λμ ν©ν 리 μμ±
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
- λ§λλ λΉμ©μ΄ μλΉν ν¬λ€.
- ν κ°λ§ λ§λ€μ΄μ μ ν리μΌμ΄μ μ 체μμ 곡μ νλλ‘ μ€κ³λμ΄μλ€. (μ μ)
- μ¬λ¬ μ€λ λκ° λμμ μ κ·Όν΄λ μμ νλ―λ‘ μλ‘ λ€λ₯Έ μ€λ λ κ°μ 곡μ κ° κ°λ₯νλ€.
β‘ μν°ν° λ§€λμ
//μν°ν° λ§€λμ μμ±
EntityManager em = emf.createEntityManager();
- λ§λλ λΉμ©μ΄ κ±°μ λ€μ§ μλλ€.
- ν μ ν리μΌμ΄μ μμ μ¬λ¬κ°κ° μμ±λλ€. (μ§μ)
- λμμ± λ¬Έμ κ° λ°μνλ―λ‘ μ€λ λ κ°μ 곡μ νλ©΄ μλλ€.
- νΈλμμ μ μμν λ λ°μ΄ν°λ² μ΄μ€μμ 컀λ₯μ μ νλνλ€.
2οΈβ£ μμμ± μ»¨ν μ€νΈλ?

β‘οΈ "μν°ν°λ₯Ό μꡬ μ μ₯νλ νκ²½" μΌλ‘ μν°ν° λ§€λμ λ‘ μν°ν°λ₯Ό μ μ₯νκ±°λ μ‘°ννλ©΄ μμμ± μ»¨ν μ€νΈμ μν°ν°λ₯Ό 보κ΄νκ³ κ΄λ¦¬νλ€.
β‘οΈ μμμ± μ»¨ν μ€νΈλ μν°ν° λ§€λμ λ₯Ό μμ±ν λ νλ λ§λ€μ΄μ§λ€.
β‘οΈ μ¬λ¬ μν°ν° λ§€λμ κ° κ°μ μμμ± μ»¨ν μ€νΈμ μ κ·Όν μλ μλ€. (βοΈ 11μ₯ λ΄μ©)
3οΈβ£ μν°ν°μ μλͺ μ£ΌκΈ°
β‘οΈ μν°ν°μλ 4κ°μ§ μνκ° μ‘΄μ¬νλ€.

β λΉμμ (new / translent)

// κ°μ²΄λ₯Ό μμ±ν μν(λΉμμ)
Member member = new Member();
member.setId(100L);
member.setUsername("νμ1");
- μν°ν° κ°μ²΄λ₯Ό μμ±
- μμν κ°μ²΄ μν
- μμμ± μ»¨ν μ€νΈλ λ°μ΄ν°λ² μ΄μ€μλ μ ν κ΄λ ¨μ΄ μλ μν
β‘ μμ (managed)

// κ°μ²΄λ₯Ό μ μ₯ν μν(μμ)
em.persist(member);
- μν°ν° λ§€λμ λ₯Ό ν΅ν΄ μν°ν°λ₯Ό μμμ± μ»¨ν μ€νΈμ μ μ₯ν μν
- μμμ± μ»¨ν μ€νΈμ μν΄ κ΄λ¦¬λλ€.
- em.find() λ JPQL(β‘οΈ DB μ μ κ·Όνλ €λ©΄ λ°μλμ΄μΌνκΈ° λλ¬Έμ) μ μ¬μ©ν΄μ μ‘°νν μν°ν°λ μμ μνμ΄λ€.
β’ μ€μμ (detached)
// νμ μν°ν°λ₯Ό μμμ± μ»¨ν
μ€νΈμμ λΆλ¦¬ (μ€μμ μν)
em.detach(member);
- μμ μνμ μν°ν°λ₯Ό μμμ± μ»¨ν μ€νΈκ° κ΄λ¦¬νμ§ μλ μν
- em.detach() & em.close() & em.clear() νΈμΆμ ν΅ν΄ μ€μμ μνλ‘ λ³ν
β£ μμ (removed)
// κ°μ²΄λ₯Ό μμ ν μν(μμ )
em.remove(member);
- μν°ν°λ₯Ό μμμ± μ»¨ν μ€νΈμ λ°μ΄ν°λ² μ΄μ€μμ μμ
4οΈβ£ μμμ± μ»¨ν μ€νΈμ νΉμ§
β‘οΈ μμμ± μ»¨ν μ€νΈμλ μλμ κ°μ νΉμ§μ΄ μλ€.
1. μμμ± μ»¨ν μ€νΈμ μλ³μ κ°
β‘οΈ μμμ± μ»¨ν μ€νΈλ μν°ν°λ₯Ό μλ³μκ°μΌλ‘ ꡬλΆν¨μΌλ‘ μμ μνλ μλ³μ κ°μ΄ λ°λμ μμ΄μΌνλ€.
λ§μ½ em.save() κ³Όμ μμ μλ³μ κ°μ΄ λ€μ΄μ€μ§ μμΌλ©΄ μ°κΈ° μ§μ° μμ΄ λ¨Όμ DB μ κ°μ μ μ₯ ν id κ°μ κ°μ§κ³ μ€κ² λλ€.
2. μμμ± μ»¨ν μ€νΈμ λ°μ΄ν°λ² μ΄μ€ μ μ₯
β‘οΈ νΈλμ μ μ 컀λ°νλ μκ° μμμ± μ»¨ν μ€νΈμ μλ‘ μ μ₯λ μν°ν°λ₯Ό λ°μ΄ν° λ² μ΄μ€μ λ°μνλ€.
β‘οΈ μ΄λ₯Ό νλ¬μ (flush) λΌκ³ νλ€. (5οΈβ£ νλ¬μ μ°Έκ³ )
3. μμμ± μ»¨ν μ€νΈκ° μν°ν°λ₯Ό κ΄λ¦¬ν λμ μ₯μ
- 1μ°¨ μΊμ
- λμΌμ± 보μ₯
- νΈλμμ μ μ§μνλ μ°κΈ° μ§μ°
- λ³κ²½ κ°μ§
- μ§μ° λ‘λ©
β μν°ν° μ‘°ν
// μν°ν°λ₯Ό μμ±ν μν(λΉμμ)
Member member = new Member();
member.setId(100L);
member.setUsername("νμ1");
// μν°ν° μμ (DB λ°μ μ )
em.persist(member);
// INSERT λ¬Έμ ν΅ν΄ DB μ λ°μ
em.flush();
// transaction.commit();
// μν°ν° μ‘°ν
Member member = em.find(Member.class, 100L);

β‘οΈ 1μ°¨ μΊμ : μμμ± μ»¨ν μ€νΈλ λ΄λΆμ μΊμλ₯Ό κ°μ§κ³ μμ, μμμνμ μν°ν°λ λͺ¨λ 1μ°¨ μΊμμ μ μ₯λλ€.
β‘οΈ 1μ°¨ μΊμμμ κ°μ μ°Ύμλ³΄κ³ μμΌλ©΄ λ°μ΄ν° λ² μ΄μ€λ₯Ό νμΈνλ€.
β‘ μν°ν° λ±λ‘
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
// μν°ν° λ§€λμ λ λ°μ΄ν° λ³κ²½ μ νΈλμμ
μ μμν΄μΌ νλ€.
transaction.begin(); // νΈλμμ
μμ
em.persist(memberA);
em.persist(memberB);
// μ¬κΈ°κΉμ§ INSERT SQLμ λ°μ΄ν°λ² μ΄μ€μ 보λ΄μ§ μλλ€.
// 컀λ°νλ μκ° λ°μ΄ν°λ² μ΄μ€μ INSERT SQLμ 보λΈλ€.
transaction.commit(); // νΈλμμ
컀λ°
β‘οΈ μ°κΈ° μ§μ° : μν°ν° λ§€λμ λ νΈλμμ μ 컀λ°νκΈ° μ§μ κΉμ§ DB μ μν°ν°λ₯Ό μ μ₯νμ§ μλλ€. λ΄λΆ 쿼리 μ μ₯μμ λͺ¨μλ 쿼리λ₯Ό μ»€λ° μ DB λ‘ flush() λ₯Ό ν΅ν΄ 보λΈλ€.


β’ μν°ν° μμ
β‘οΈ λ³κ²½ κ°μ§ : μν°ν°λ₯Ό μμ ν λλ update() λͺ λ Ήμ΄κ° λ°λ‘ μλ κ²μ΄ μλλΌ λ¨μν μν°ν°λ₯Ό μ‘°νν΄μ λ°μ΄ν°λ§ λ³κ²½νλ©΄ λλ€.

β‘οΈ JPA μμλ μμ μ μΏΌλ¦¬λ¬Έμ΄ λν΄νΈλ‘λ μ 체κ°μ μμ νλ 쿼리문μ μμ±νμ¬ μ¬μ¬μ©νλ λ°©μμ΄λ€.
β‘οΈ μνλ κ²½μ° @DynamicUpdate λ₯Ό ν΅ν΄ μνλ 컬λΌλ§ μμ νλ 쿼리λ₯Ό λ³΄λΌ μ μλ€.
import org.hibernate.annotation.DynamicUpdate;
@Entity
@DynamicUpdate
@Table(name = "Member")
public class Member {...}
β£ μν°ν° μμ
Member memberA = em.find(Member.class, 100L); // μμ λμ μν°ν° μ‘°ν
em.remove(memberA); // μν°ν° μμ
β‘οΈ μν°ν° λ±λ‘κ³Ό λΉμ·νκ² μμ 쿼리λ₯Ό μ°μ§ μ§μ° SQL μ μ₯μμ λ±λ‘ ν νΈλμμ 컀λ°μ ν΅ν΄ flush() λ₯Ό νΈμΆνλ©΄ DB μ μ λ¬νλ€.
β‘οΈ em.remove() λ₯Ό νΈμΆνλ μκ° μμμ± μ»¨ν μ€νΈμμλ μ κ±°λλ€.
5οΈβ£ νλ¬μ
β‘οΈ νλ¬μλ μμμ± μ»¨ν μ€νΈμ λ³κ²½ λ΄μ©μ λ°μ΄ν°λ² μ΄μ€μ λ°μνλ©° μλ 3κ°μ§ λ°©λ²μΌλ‘ νλ¬μλ₯Ό μνν μ μλ€.
1. em.flush() λ₯Ό μ§μ νΈμΆ : ν μ€νΈμμλ μ°μΌ μ μμ§λ§ μ€λ¬΄μμλ κ±°μ μ¬μ©λμ§ μλλ€κ³ ν¨
2. νΈλμμ μ»€λ° μ : νλ¬μκ° μλμΌλ‘ νΈμΆλ¨
3. JPQL 쿼리 μ€ν μ : νλ¬μκ° μλμΌλ‘ νΈμΆλ¨
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// μ€κ°μ μ‘°ν (JPQL): DB μ μμ΄μΌ κ°λ₯νλ―λ‘ λ¨Όμ flush() λ₯Ό μν
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
β νλ¬μ λͺ¨λ μ΅μ
| λͺ¨λ | μ€λͺ |
| FlushModeType.AUTO | 컀λ°μ΄λ 쿼리λ₯Ό μ€νν λ νλ¬μ(κΈ°λ³Έκ°) |
| FlushModeType.COMMIT | 컀λ°ν λλ§ νλ¬μ |
6οΈβ£ μ€μμ
β μν°ν°λ₯Ό μ€μμ μνλ‘ μ ν : detach()

public void testDetached() {
...
// νμ μν°ν° μμ±, λΉμμ μν
Member member = new Member();
member.setId("memberA");
member.setUsername("νμA");
// νμ μν°ν° μμ μν
em.persist(member);
// νμ μν°ν°λ₯Ό μμμ± μ»¨ν
μ€νΈμμ λΆλ¦¬, μ€μμ μν
em.detach(member);
transaction.commit(); //νΈλμμ
컀λ°
}
β‘οΈ μμ μνμλ€κ° λλ μμμ± μ»¨ν μ€νΈκ° κ΄λ¦¬νμ§ μλ μν (μ€μμ μν) λ‘ μ νλ¨
β‘ μμμ± μ»¨ν μ€νΈ μ΄κΈ°ν : clear()

//μν°ν° μ‘°ν, μμ μν
Member member = em.find(Member.class, "memberA");
em.clear(); //μμμ± μ»¨ν
μ€νΈ μ΄κΈ°ν
//μ€μμ μν
member.setUsername("changeName");
β‘οΈ μμμ± μ»¨ν μ€νΈ μ΄κΈ°νμ λͺ¨λ μ€μμ μνκ° λλ―λ‘ μ 보λ₯Ό λ°κΎΈμ΄λ μΆνμ DB μλ λ°μλμ§ μλλ€.
β’ μμμ± μ»¨ν μ€νΈ μ’ λ£ : close()

public void closeEntityManager() {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("jpabook");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin(); // [νΈλμμ
] - μμ
Member memberA = em.find(Member.class, "memberA");
Member memberB = em.find(Member.class, "memberB");
transaction.commit(); // [νΈλμμ
] = 컀λ°
em.close(); // μμμ± μ»¨ν
μ€νΈ λ«κΈ°(μ’
λ£)
}
β‘οΈ λμ΄μ μν°ν° memberA μ memberB λ₯Ό κ΄λ¦¬νμ§ μλλ€.
β£ μ€μμ μνμ νΉμ§
- κ±°μ λΉμμ μνμ κ°κΉλ€.
- μλ³μ κ°μ κ°μ§κ³ μλ€.
- μ§μ° λ‘λ©μ ν μ μλ€.
β€ λ³ν© : merge()

// merge() λ©μλ μ μ
public <T> T merge(T entity);
// μ¬μ© μμ
Member mergeMember = em.merge(member);
β‘οΈ μ€μμ μνλ₯Ό λ€μ μμ μνλ‘ λ³κ²½νκΈ° μν΄μ merge() λ₯Ό μ¬μ©νλ€.
Member member = new Member();
Member newMember = em.merge(member); //λΉμμ λ³ν©
tx.commit();
β‘οΈ μ‘°νλ₯Ό ν΅ν΄ λ°κ²¬νμ§ λͺ»ν κ²½μ° μλ‘κ² μμ±νμ¬ λΉμμ μνμ μν°ν°λ₯Ό μμ μνλ‘ λ³ννλ€.
7οΈβ£ μ 리
β‘οΈ μλ λμμμ λ¬Έμ μν©μ μ΄ν΄νκ³ ν΄κ²°λ°©λ²κΉμ§ μ΄ν΄νκ²λλ€λ©΄ μμμ± μ»¨ν μ€νΈμ κ°λ μ μ λλ‘ μ΄ν΄νλ€κ³ μκ°ν μ μμ κ² κ°λ€.
'JPA π' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| [JPA] μλ° ORM νμ€ JPA νλ‘κ·Έλλ° Ch.5 (1) | 2023.05.19 |
|---|---|
| [JPA] μλ° ORM νμ€ JPA νλ‘κ·Έλλ° Ch.4 (0) | 2023.05.08 |
| [JPA] μλ° ORM νμ€ JPA νλ‘κ·Έλλ° Ch.2 (0) | 2023.04.15 |
| [JPA] μλ° ORM νμ€ JPA νλ‘κ·Έλλ° Ch.1 (0) | 2023.04.07 |