πλͺ©μ°¨ 1. μν°ν° λ§€λμ ν©ν 리μ μν°ν° λ§€λμ 2. μμμ± μ»¨ν μ€νΈμ μν°ν° μλͺ μ£ΌκΈ° 3. μμμ± μ»¨ν μ€νΈμ νΉμ§ |
1. μν°ν° λ§€λμ νν 리μ μν°ν° λ§€λμ
- JPAμμ Entity Managerλ Entityμ λν μ‘°ν, μμ , μμ , μ μ₯ λ± Entityμ κ΄λ ¨λ λͺ¨λ μΌμ μ²λ¦¬ν©λλ€.
- Entity Manager Factory λ Entity Managerλ₯Ό μμ±νλ μν μ νλ©° μμ±νλ λΉμ©μ΄ ν½λλ€.
- λ°μ΄ν° λ² μ΄μ€λ₯Ό νλλ§ μ¬μ©νλ μ΄ν리μΌμ΄μ μμλ μΌλ°μ μΌλ‘ Entity Manager Factoryλ₯Ό νλλ§ μμ±νμ¬ μ΄λ₯Ό 곡μ νλ©° μ¬μ©ν©λλ€.
- Entity Manager Factoryλ Thread safe ν©λλ€. ( μλ‘ λ€λ₯Έ μ€λ λκ° λμμ μ κ·Όν΄λ μμ ν©λλ€. )
- Entity Managerκ° νμν λλ§λ€ Entity Manager Factoryλ‘ μμ±νλ©°, Thread safe νμ§ μμ΅λλ€.
( μλ‘ λ€λ₯Έ μ€λ λκ° λμ μ κ·Όνλ©΄ λμμ± λ¬Έμ κ° λ°μ )
2. μμμ± μ»¨ν μ€νΈμ μν°ν° μλͺ μ£ΌκΈ°
μμμ± μ»¨ν μ€νΈ( Persistence Context ) λ 무μμΌκΉμ?
μμμ± μ»¨ν μ€νΈλ 'μν°ν°λ₯Ό μꡬ μ μ₯νλ νκ²½' μ΄λΌλ λ»μ λλ€.
μν°ν° λ§€λμ λ μμμ± μ»¨ν μ€νΈμ μν°ν°λ₯Ό 보κ΄νκ³ κ΄λ¦¬ν©λλ€.
λ Όλ¦¬μ μΈ κ°λ μ κ°κΉμ°λ©° μ¬λ¬ μν°ν° λ§€λμ κ° κ°μ μμμ± μ»¨ν μ€νΈμ μ κ·Όν μλ μμ΅λλ€.
μν°ν° μλͺ
μ£ΌκΈ°
1. λΉμμ ( new / transient )
2. μμ ( managed )
3. μ€μμ (detached )
4. μμ ( removed )
1. λΉμμ ( new / transient )
: μμν κ°μ²΄ μνλ‘ μμμ± μ»¨ν
μ€νΈλ‘ κ΄λ¦¬λκΈ° μ μ μν
Member member = new Member(); // μμν Javaκ°μ²΄ μμ±
member.setName("νκΈΈλ"); // λ³κ²½ κ°μ§μ λμμ΄ μλλ©°, μ€μ DBμ μν°ν°μ 무κ΄ν μνμ
λλ€.
2. μμ ( managed )
: μμμ± μ»¨ν μ€νΈμ μν΄ κ΄λ¦¬λλ μνμ λλ€.
em.persist(member); // μμμ± μ»¨ν
μ€νΈμ κ°μ²΄λ₯Ό μ μ₯ν μν ( μμ )
* em.find () , JPQLμ 쿼리 λ±μΌλ‘ DBλ‘λΆν° μ‘°νν μν°ν°λ λ§μ°¬κ°μ§λ‘ μμμνμ λλ€.
3. μ€μμ ( detached )
: μμ μνμ μν°ν°λ₯Ό λμ΄μ μμμ± μ»¨ν
μ€νΈκ° κ΄λ¦¬νμ§ μλ μν
em.detach(member); // 1.member μν°ν°λ₯Ό μμμ± μ»¨ν
μ€νΈμμ λΆλ¦¬νλ λ©μλ
# μλ λκ°μ§ κ²½μ°μλ μ€μμ μνκ° λ©λλ€.
em.close(); // μμμ± μ»¨ν
μ€νΈλ₯Ό λ«λ λ©μλ
em.clear(); // μμμ± μ»¨ν
μ€νΈλ₯Ό μ΄κΈ°ννλ λ©μλ
4. μμ ( removed )
: μν°ν°λ₯Ό μμμ± μ»¨ν
μ€νΈμ λ°μ΄ν°λ² μ΄μ€μμ μμ νλ κ²½μ°μ μν
em.remove(member); // κ°μ²΄λ₯Ό μμ ν μν
3. μμμ± μ»¨ν μ€νΈμ νΉμ§
- μμμ± μ»¨ν μ€νΈμ μλ³μ κ° : μν°ν°λ₯Ό μλ³μ κ°μΌλ‘ ꡬλΆνλ―λ‘ μμ μνλ λ°λμ μλ³μ κ°μ΄ μμ΄μΌ ν©λλ€.
- μμμ± μ»¨ν μ€νΈμ λ°μ΄ν°λ² μ΄μ€ μ μ₯ : μμμ± μ»¨ν μ€νΈμ μ μ₯λ μν°ν°λ νΈλμμ μ 컀λ°νλ μκ° DBμ λ°μλλ©° μ΄κ²μ FlushλΌκ³ ν©λλ€.
- μμμ± μ»¨ν
μ€νΈκ° μν°ν°λ₯Ό κ΄λ¦¬νμ¬ μκΈ°λ μ΄μ
- 1μ°¨ μΊμ
- λμΌμ± 보μ₯
- νΈλμμ μ μ§μνλ μ°κΈ° μ§μ°
- λ³κ²½ κ°μ§
- μ§μ° λ‘λ©
μν°ν° μ‘°ν
- μμμ± μ»¨ν μ€νΈ λ΄λΆμ μΊμ( Map )κ° μμΌλ©° μ΄λ₯Ό 1μ°¨ μΊμλΌκ³ ν©λλ€. ( λ©λͺ¨λ¦¬μ μ‘΄μ¬ )
- 1μ°¨ μΊμμ Keyλ‘λ @Idλ‘ λ§€νν μλ³μκ° μ¬μ©λλ©° Valueμ μν°ν° μΈμ€ν΄μ€μ λλ€.
- μμ μνμ μν°ν°λ λͺ¨λ 1μ°¨ μΊμμ μ μ₯λμ΄ μμ΅λλ€.
- μν°ν°λ₯Ό μ‘°ννλ κ²½μ° λ¨Όμ 1μ°¨ μΊμμμ μν°ν°λ₯Ό μ°Ύκ³ λ§μ½ 1μ°¨ μΊμμ μμΌλ©΄ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ‘°ννμ¬ μν°ν°λ₯Ό μμ±ν©λλ€. μ΄ν 1μ°¨ μΊμμ μν°ν°λ₯Ό μ μ₯ν ν μμ μνμ μν°ν°λ₯Ό λ°νν©λλ€.
- μμμ± μ»¨ν μ€νΈλ μλ³μλ₯Ό ν΅ν΄ 1μ°¨ μΊμμμ κ°μ μν°ν° μΈμ€ν΄μ€λ₯Ό λ°ννλ―λ‘ μ±λ₯μ μ΄μ κ³Ό μν°ν°μ λμΌμ±μ 보μ₯ν©λλ€. ( μλ κ²½μ° μ°Έκ³ )
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); // λμΌμ± λΉκ΅
κ²°κ³Ό : true
μν°ν° λ±λ‘
- μν°ν° λ§€λμ λ νΈλμμ μ 컀λ°νκΈ° μ§μ κΉμ§ DBμ μν°ν°λ₯Ό μ μ₯νμ§ μκ³ μ°κΈ° μ§μ° SQL μ μ₯μμ INSERT SQLμ λͺ¨μλκ³ νΈλμμ 컀λ°ν λ λͺ¨μλ 쿼리λ₯Ό DBμ 보λ λλ€. μ΄κ²μ μ°κΈ° μ§μ°( Transactional write-behind )μ΄λΌ ν©λλ€.
μν°ν° μμ
- μν°ν° μμ , μ‘°ν, μ μ₯κ³Όλ λ€λ₯΄κ² μν°ν°λ₯Ό μμ νλ λ³λμ λ©μλ( em.update() λ± )λ μ‘΄μ¬νμ§ μμ΅λλ€.
- λ³κ²½ κ°μ§( Dirty Checking ) κΈ°λ₯μ ν΅νμ¬ μν°ν°μ μμ μ¬νμ λ°μ΄ν°λ² μ΄μ€μ λ°μν©λλ€.
- λ³κ²½ κ°μ§λ μν°ν°λ₯Ό μμμ± μ»¨ν μ€νΈμ 보κ΄ν λ ( μ μ₯ λλ DBμμ μ‘°ννμ λ ), μ΅μ΄μ μνλ₯Ό 볡μ¬ν΄μ μ μ₯ν΄λ‘λλ€. μ΄λ₯Ό μ€λ μ·( Snap shot ) μ΄λΌ νλ©°, Flush μμ μ μ€λ μ·κ³Ό μν°ν°λ₯Ό λΉκ΅νμ¬ λ³κ²½λ μν°ν°λ₯Ό μ°Ύκ³ λ³κ²½λ μν°ν°μ λν μμ 쿼리λ₯Ό μ°κΈ° μ§μ° SQL μ μ₯μμ 보λ λλ€.
- λ³κ²½ κ°μ§λ μμ μνμ μν°ν°μλ§ μ μ©λ©λλ€.
JPAμ μ λ°μ΄νΈ μ λ΅
- JPAλ κΈ°λ³Έμ μΌλ‘ μν°ν°μ λͺ¨λ νλλ₯Ό μ
λ°μ΄νΈνλ μ λ΅μ μ¬μ©νλ©°, μλμ μ΄μ μ κ°μ§κ³ μμ΅λλ€.
- λͺ¨λ νλλ₯Ό μ¬μ©νλ©΄ μμ μΏΌλ¦¬κ° νμ κ°κ³ , λ°λΌμ μ ν리μΌμ΄μ λ‘λ© μμ μ μμ 쿼리λ₯Ό 미리 μμ±ν΄λκ³ μ¬μ¬μ©ν μ μμ΅λλ€.
- λ°μ΄ν°λ² μ΄μ€μ λμΌν 쿼리λ₯Ό 보λ΄λ©΄ λ°μ΄ν°λ² μ΄μ€λ μ΄μ μ ν λ² νμ±λ 쿼리λ₯Ό μ¬μ¬μ©ν μ μμ΅λλ€.
- νλκ° λ§κ±°λ μ μ₯λλ λ΄μ©μ΄ λ무 ν° κ²½μ° μμ λ λ°μ΄ν°λ§ μ¬μ©νμ¬ λμ μΌλ‘ UPDATE 쿼리λ₯Ό μμ±νλ μ λ΅λ μ‘΄μ¬ν©λλ€. μ΄ κ²½μ°μλ Entity ν΄λμ€μ @DynamicUpdate μ΄λ Έν μ΄μ μ μ¬μ©νλ©΄ λ©λλ€.
@Entity
@DynamicUpdate // λμ μΌλ‘ UPDATE SQLμ μμ±
public class Member{
...
}
μν°ν° μμ
- μν°ν°λ₯Ό μμ νλ €λ©΄ μμ λμ μν°ν°λ₯Ό μ‘°νν΄μΌ ν©λλ€.
- em.remove(member) μ member μν°ν° DELETE SQLμ μ°κΈ° μ§μ° SQL μ μ₯μμ λ±λ‘ν©λλ€.
- em.remove(member) λ₯Ό νΈμΆνλ μκ° memberμ μμμ± μ»¨ν μ€νΈμμ μ κ±°λ©λλ€.
Member member = em.find(Member.class , "member"); // μμ λμ μν°ν° μ‘°ν
em.remove(member); // μν°ν° μμ : μν°ν° μμ SQLμ μ°κΈ° μ§μ° μ μ₯μλ‘ λ³΄λ΄κ³ , μμμ± μ»¨ν
μ€νΈμμ μ κ±°
νλ¬μ ( Flush )
- νλ¬μλ μμμ± μ»¨ν μ€νΈμ λ³κ²½ λ΄μ©μ λ°μ΄ν°λ² μ΄μ€λ‘ λ°μνλ λ©μλμ λλ€.
- νλ¬μλ μμμ± μ»¨ν μ€νΈμ λ³κ²½ λ΄μ©μ λ°μ΄ν°λ² μ΄μ€μ λκΈ°ννλ κ²μ΄μ§ μμμ± μ»¨ν μ€νΈμ 보κ΄λ μν°ν°λ₯Ό μ§μ°λ κ²μ΄ μλλλ€. ( νλ¬μλΌλ μ΄λ¦μ μ€ν΄νμ§ λ§μλ€. )
- νλ¬μλ₯Ό μ€ννλ κ²½μ° λ€μκ³Ό κ°μ μΌμ΄ μΌμ΄λ©λλ€.
- λ³κ²½ κ°μ§κ° λμν΄μ μμμ± μ»¨ν
μ€νΈμ μλ λͺ¨λ μν°ν°λ₯Ό μ€λ
μ·κ³Ό λΉκ΅ν΄μ μμ λ μν°ν°λ₯Ό μ°Ύλλ€.
μμ λ μν°ν°λ μμ 쿼리λ₯Ό λ§λ€μ΄ μ°κΈ° μ§μ° SQL μ μ₯μμ λ±λ‘νλ€. - μ°κΈ° μ§μ° SQL μ μ₯μμ 쿼리λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ‘νλ€. ( λ±λ‘, μμ , μμ 쿼리 )
- λ³κ²½ κ°μ§κ° λμν΄μ μμμ± μ»¨ν
μ€νΈμ μλ λͺ¨λ μν°ν°λ₯Ό μ€λ
μ·κ³Ό λΉκ΅ν΄μ μμ λ μν°ν°λ₯Ό μ°Ύλλ€.
νλ¬μλ₯Ό νΈμΆνλ λ°©λ² 3κ°μ§
- μ§μ νΈμΆ
μν°ν° λ§€λμ μ flush() λ₯Ό μ§μ νΈμΆνμ¬ μμμ± μ»¨ν μ€νΈλ₯Ό κ°μ λ‘ νλ¬μνλ€. ν μ€νΈλ λ€λ₯Έ νλ μμν¬μ JPAλ₯Ό ν¨κ» μ¬μ©ν λλ₯Ό μ μΈνκ³ κ±°μ μ¬μ©νμ§ μμ΅λλ€. - νΈλμμ
μ»€λ° μ νλ¬μ μλ νΈμΆ
λ°μ΄ν°λ² μ΄μ€μ λ³κ²½ λ΄μ©μ SQLλ‘ μ λ¬νμ§ μκ³ νΈλμμ λ§ μ»€λ°νλ©΄ μ΄λ€ λ°μ΄ν°λ λ°μ΄ν°λ² μ΄μ€μ λ°μλμ§ μμ΅λλ€. λ°λΌμ νΈλμμ μ 컀λ°νκΈ° μ μ κΌ νλ¬μλ₯Ό νΈμΆν΄μ μμμ± μ»¨ν μ€νΈμ λ³κ²½ λ΄μ©μ λ°μ΄ν°λ² μ΄μ€μ λ°μν΄μΌ ν©λλ€. JPAλ μ΄λ° λ¬Έμ λ₯Ό μλ°©νκΈ° μν΄ νΈλμμ μ 컀λ°ν λ νλ¬μλ₯Ό μλμΌλ‘ νΈμΆν©λλ€. - JPQL 쿼리 μ€ν μ νλ¬μ μλ νΈμΆ
JPQLμ΄λ Criteria κ°μ κ°μ²΄μ§ν₯ 쿼리λ₯Ό νΈμΆν λλ νλ¬μκ° μ€νλ©λλ€. ( SQLλ‘ λ³νλμ΄ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ‘°ν ) - μλ³μλ₯Ό κΈ°μ€μΌλ‘ μ‘°ννλ find()μ κ²½μ°μλ νλ¬μκ° μ€νλμ§ μμ΅λλ€.
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// JPAμμ μ€κ°μ JPQLλ‘ μ‘°ννλ κ²½μ° DBμ memberA, memberB, memberC κ° λ°μλμ§ μμ
// 쿼리 κ²°κ³Όλ‘ μ‘°νλμ§ μλ κ²λ€μ μλ°©νκΈ° μνμ¬ νλ¬μλ₯Ό μλμΌλ‘ νΈμΆν¨
query = em.createQuery("SELECT m FROM Member m", Member.class);
List<Member> members = query.getResultList();
νλ¬μ λͺ¨λ μ΅μ
- FlushModeType.AUTO : 컀λ°μ΄λ 쿼리λ₯Ό μ€νν λ νλ¬μ ( κΈ°λ³Έκ° )
- FlushModeType.COMMIT : 컀λ°ν λλ§ νλ¬μ
- COMMIT λͺ¨λλ μ±λ₯ μ΅μ νλ₯Ό μν΄ μ¬μ©ν μ μλ€κ³ ν©λλ€.
em.setFlushMode(FlushModeType.COMMIT) // νλ¬μ λͺ¨λλ₯Ό μ§μ μ€μ
μ€μμ
- μμ μνμ μν°ν°κ° μμμ± μ»¨ν μ€νΈμμ λΆλ¦¬λ( detached ) κ²μ μ€μμ μνλΌ ν©λλ€. λ°λΌμ μ€μμ μνμ μν°ν°λ μμμ± μ»¨ν μ€νΈκ° μ 곡νλ κΈ°λ₯μ μ¬μ©ν μ μμ΅λλ€.
- ν¬κ² 3κ°μ§ λ©μλλ₯Ό μ¬μ©νμ¬ μμ μνμ μν°ν°λ₯Ό μ€μμ μνλ‘ λ§λ€ μ μμ΅λλ€. detach() / clear() / close()
μν°ν°λ₯Ό μ€μμ μνλ‘ μ ν : detach( entity )
- νΉμ μν°ν°λ§ μ€μμ μνλ‘ λ§λλ λ©μλμ λλ€.
- μ΄ λ©μλλ₯Ό νΈμΆνλ μκ° 1μ°¨ μΊμλΆν° μ°κΈ° μ§μ° SQL μ μ₯μκΉμ§ ν΄λΉ μν°ν°λ₯Ό κ΄λ¦¬νκΈ° μν λͺ¨λ μ λ³΄κ° μ κ±°λ©λλ€.
- μμμ± μ»¨ν μ€νΈκ° λμ΄μ κ΄λ¦¬νμ§ μμΌλ―λ‘ νΈλμμ μ 컀λ°ν΄λ λ°μ΄ν°λ² μ΄μ€μ μ μ₯λμ§ μμ΅λλ€.
# detach() λ©μλ μ μ
public void detach(Object entity);
# μ¬μ© μμ
em.persist(member); // member μν°ν° μμ μν
...
em.detach(member) // μμμ± μ»¨ν
μ€νΈμμ λΆλ¦¬, member μν°ν° μ€μμ μν
μμμ± μ»¨ν μ€νΈ μ΄κΈ°ν : clear( )
- μμμ± μ»¨ν
μ€νΈλ₯Ό μ΄κΈ°νν΄μ ν΄λΉ μμμ± μ»¨ν
μ€νΈμ λͺ¨λ μν°ν°λ₯Ό μ€μμ μνλ‘ λ§λλ λ©μλμ
λλ€
.( μμμ± μ»¨ν μ€νΈλ₯Ό μ κ±°νκ³ μλ‘ λ§λλ κ²κ³Ό κ°μ ν¨κ³Ό ) - μμμ± μ»¨ν μ€νΈκ° κ΄λ¦¬νμ§ μμΌλ―λ‘ λ€μ μ½λμ setUsername()μ λν λ³κ²½ κ°μ§κ° λμνμ§ μμ΅λλ€.
// μν°ν° μ‘°ν, μμ μνκ° λ¨
Member member = em.find(Member.class, "memberA");
em.clear(); // μμμ± μ»¨ν
μ€νΈ μ΄κΈ°ν
// μ€μμ μν
member.setUsername("changeName");
μμμ± μ»¨ν μ€νΈ μ’ λ£ : close( )
- μμμ± μ»¨ν μ€νΈλ₯Ό μ’ λ£μν€λ λ©μλμ λλ€.
- μμμ± μ»¨ν μ€νΈλ₯Ό μ’ λ£νλ©΄ μμμ± μ»¨ν μ€νΈκ° κ΄λ¦¬νλ λͺ¨λ μν°ν°κ° μ€μμ μνκ° λ©λλ€.
μμ μνμ μν°ν°λ μ£Όλ‘ μμμ± μ»¨ν μ€νΈκ° μ’ λ£λλ©΄μ μ€μμ μνκ° λ©λλ€. κ°λ°μκ° μ§μ μ€μμ μνλ‘ λ§λλ μΌμ λλ¬Όλ€κ³ ν©λλ€.
μ€μμ μνμ νΉμ§
- κ±°μ λΉμμ μνμ κ°κΉμ΅λλ€.
( 1μ°¨ μΊμ, μ°κΈ° μ§μ°, λ³κ²½ κ°μ§, μ§μ° λ‘λ©μ ν¬ν¨ν μμμ± μ»¨ν μ€νΈκ° μ 곡νλ μ΄λ€ κΈ°λ₯λ λμνμ§ μμ΅λλ€. ) - μλ³μ κ°μ κ°μ§κ³ μμ΅λλ€.
( λΉμμ μνλ μλ³μ κ°μ΄ μμ μ μμ§λ§ μ€μμ μνλ μ΄λ―Έ ν λ² μμ μνμμΌλ―λ‘ λ°λμ μλ³μ κ°μ κ°μ§κ³ μμ΅λλ€. κΈ°λ³Έν€ μμ± μ λ΅μ IDENTITYλ‘ μ¬μ©νλ κ²½μ° persist() μ DBμ μ κ·Ό ) - μ§μ° λ‘λ©μ ν μ μμ΅λλ€.
λ³ν© : merge( entity )
- μ€μμ μνμ μν°ν°λ₯Ό λ€μ μμ μνλ‘ λ³κ²½νλ €λ©΄ λ³ν©μ μ¬μ©νλ©΄ λ©λλ€.
- merge() λ©μλλ μ€μμ μνμ μν°ν°λ₯Ό λ°μ κ·Έ μ λ³΄λ‘ μλ‘μ΄ μμ μνμ μν°ν°λ₯Ό λ°νν©λλ€.
- νλΌλ―Έν°λ‘ μ¬μ©λ μν°ν°λ merge()μ΄νμλ μ€μμ μνλ‘ λ¨μμμ΅λλ€.
public class ExamMergeMain{
public static void main(String[] args){
Member member = createMember("memberA", "νμ1");
member.setUsername("νμλͺ
λ³κ²½"); // μ€μμ μνμμ λ³κ²½
mergeMember(member);
}
static Member createMember(String id, String userName){
// μμμ± μ»¨νμ€νΈ 1 μμ
EntityManager em1 = emf.createEntityManager();
EntityTransaction tx1 = em1.getTransaction();
tx1.begin();
Member member = new Member();
member.setId(id);
member.setUserName(userName);
em1.persist(member);
tx1.commit(); // member μν°ν°κ° dbμ λ°μλ¨
em1.close(); // μμμ± μ»¨νμ€νΈ 1 μ’
λ£, member μν°ν°κ° μ€μμ μνκ° λ¨
return member;
}
static void mergeMember(Member member){
// μμμ± μ»¨νμ€νΈ 2 μμ
EntityManager em2 = emf.createEntityManager();
EntityTransaction tx2 = em2.getTransaction();
tx2.begin();
em2.merge(member); // μ€μμ μνμ memberμ merge() μν
tx2.commit();
// μ€μμ μν
System.out.println("member = " + member.getUsername());
// μμ μν
System.out.println("mergeMember = " + mergeMember.getUsername());
System.out.println("em2 contains member = " + em2.contains(member));
System.out.println("em2 contains mergeMember = " + em2.contains(mergeMember));
em2.close(); // μμμ± μ»¨νμ€νΈ 2 μ’
λ£
}
}
# μΆλ ₯ κ²°κ³Ό
member = νμλͺ
λ³κ²½
mergeMember = νμλͺ
λ³κ²½
em2 contains member = false
em2 contains mergeMember = true
- main λ©μλμμ setUserName()μ νΈμΆνμμ§λ§ μ΄λ―Έ em1μ΄ μ’ λ£λ μνμ΄λ―λ‘ memberμ μ€μμ μνμ΄κ³ , λ³κ²½ κ°μ§κ° μΌμ΄λμ§ λͺ»νλ μν©μ λλ€.
- mergeMember()λ©μλμμ memberμ μλ³μλ₯Ό κΈ°λ°μΌλ‘ ν μλ‘μ΄ μμ μνμ μν°ν°λ₯Ό λ°ννκ³ , μ΄ κ³Όμ μμ λ³κ²½ κ°μ§κ° λ°μνμμ΅λλ€.
- containsλ μμμ± μ»¨ν
μ€νΈκ° μν°ν°λ₯Ό κ΄λ¦¬νλμ§ νμΈνλ λ©μλμ
λλ€.
( μΆλ ₯ κ²°κ³Ό memberμ em2μ κ΄λ¦¬λκ³ μμ§ μμ΅λλ€. μ¦, μ¬μ ν μ€μμ μνμ΄λ©° μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±νμλ€λ κ²μ νμΈν μ μμ΅λλ€. )
μ΄μ merge( )μ λμ κ³Όμ μ ꡬ체μ μΌλ‘ μ΄ν΄λ³΄κ² μ΅λλ€.
- merge( )λ₯Ό μ€ννλ€.
- νλΌλ―Έν°λ‘ λμ΄μ¨ μ€μμ μν°ν°μ μλ³μ κ°μΌλ‘ 1μ°¨ μΊμμμ μν°ν°λ₯Ό μ‘°ννλ€.
- λ§μ½ 1μ°¨ μΊμμ μν°ν°κ° μμΌλ©΄ λ°μ΄ν°λ² μ΄μ€μμ μν°ν°λ₯Ό μ‘°ννκ³ 1μ°¨ μΊμμ μ μ₯νλ€.
( μ΄ κ³Όμ μμ 1μ°¨ μΊμμ snapshotμ΄ μ μ₯λκ³ , μ΄ν λ³κ²½ κ°μ§κ° μνλλ κ² κ°μ΅λλ€. )
- λ§μ½ 1μ°¨ μΊμμ μν°ν°κ° μμΌλ©΄ λ°μ΄ν°λ² μ΄μ€μμ μν°ν°λ₯Ό μ‘°ννκ³ 1μ°¨ μΊμμ μ μ₯νλ€.
- μ‘°νν μμ μν°ν°( mergeMember )μ member μν°ν°μ κ°μ μ±μ λ£λλ€.
( member μν°ν°μ λͺ¨λ κ°μ mergeMemberμ λ°μ΄ λ£λλ€. μ΄λ mergeMemberμ "νμ1"μ΄λΌλ μ΄λ¦μ΄ "νμλͺ λ³κ²½"μΌλ‘ λ°λλ€. ) - mergeMemberλ₯Ό λ°ννλ€.
λΉμμ λ³ν©
- merge( )λ λΉμμ μν°ν°λ μμ μνλ‘ λ§λ€ μ μμ΅λλ€.
- νλΌλ―Έν°λ‘ λμ΄μ¨ μν°ν°μ μλ³μ κ°μΌλ‘ μμμ± μ»¨ν μ€νΈλ₯Ό μ‘°ννκ³ μ°Ύλ μν°ν°κ° μμΌλ©΄ λ°μ΄ν°λ² μ΄μ€μμ μ‘°νν©λλ€. ( dbμλ μμΌλ©΄ μλ‘μ΄ μν°ν°λ₯Ό μμ±ν΄μ λ³ν©ν©λλ€. )
μ 리νμλ©΄ λ³ν©μ μλ³μ κ°μΌλ‘ μν°ν°λ₯Ό μ‘°νν μ μμΌλ©΄ λΆλ¬μ λ³ν©νκ³ μ‘°νν μ μμΌλ©΄ μλ‘ μμ±ν΄μ λ³ν©ν©λλ€. μ¦, save or update κΈ°λ₯μ μνν©λλ€.
# κΈμ μ¬μ©λ μ€λͺ κ³Ό μ½λλ κΉμνλμ "μλ° ORM νμ€ JPA νλ‘κ·Έλλ°"μ μ 리ν λ΄μ©μ λλ€.
'JPA' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[ JPA ] κΈ°λ³Έ ν€ λ§€ν (2) | 2023.08.05 |
---|