μλ°©ν₯ 맀ν
- λ°λλ°©ν₯μΌλ‘λ κ·Έλν μ‘°νκ° κ°λ₯ν΄μΌν¨
μ°κ΄ κ΄κ³μ μ£ΌμΈκ³Ό
- μ mappedByλ₯Ό ν΄μ£Όλ 건μ§?
- κ°μ²΄λ μλ‘λ₯Ό ν¬ν¨νκ³ μμ΄μΌ ν¨ (2κ°κ° νμ)
κ°μ²΄μ ν μ΄λΈμ΄ κ΄κ³λ₯Ό λ§Ίλ μ°¨μ΄
κ°μ²΄ μ°κ΄κ΄κ³
- νμ -> ν μ°κ΄ κ΄κ³ 1κ° (λ¨λ°©ν₯)
- ν -> νμ μ°κ΄κ΄κ³ 1κ° (λ¨λ°©ν₯)
ν μ΄λΈ μ°κ΄κ΄κ³
- νμ <-> νμ μ°κ΄κ΄κ³ 1κ° (μλ°©ν₯)
μ΄ μ°¨μ΄λ₯Ό μ΄λ»κ² 극볡ν κ±°λ??
κ°μ²΄μ μλ°©ν₯ κ΄κ³
κ°μ²΄λ μ¬μ€ μλ°©ν₯ κ΄κ³κ° μλλΌ μλ‘ λ€λ₯Έ λ¨λ°©ν₯ κ΄κ³ 2κ°μ΄λ€.
κ°μ²΄λ₯Ό μλ°©ν₯μΌλ‘ μ°Έμ‘°νλ €λ©΄ λ¨λ°©ν₯ μ°κ΄κ΄κ³λ₯Ό 2κ° λ§λ€μ΄μΌ ν¨
ν μ΄λΈμ μλ°©ν₯ κ΄κ³
ν μ΄λΈμ μΈλν€ νλλ‘ λν μ΄λΈμ μ°κ΄ κ΄κ³λ₯Ό κ΄λ¦¬
λ μ€ νλλ‘ μΈλν€λ₯Ό κ΄λ¦¬ν΄μΌ νλ€
- κ°μ²΄λ λ κ³³μμ μ°κ΄κ΄κ³μ μλ κ°μ²΄λ₯Ό λ€λ£¨κ³ μμ
- κ·Έλ¬λ©΄ λ λ―Ώμ΄μΌ νλ?
- λκ°λ μ΄μ°¨νΌ λ€λ₯΄λ€. λ μ€ νλλ§ μ£ΌμΈμΌλ‘ λ§λ€μ
μ°κ΄ κ΄κ³μ μ£ΌμΈ
- λκ³³μ μλ κ°μ²΄μ€ νλλ§ μ£ΌμΈμΌλ‘ λκ³ κ±λ§ μν₯μ λ°μ
μλ°©ν₯ 맀ν κ·μΉ
- κ°μ²΄μ λ κ΄κ³ μ€ νλλ₯Ό μ°κ΄κ΄κ³μ μ£ΌμΈμΌλ‘ μ§μ
- μ°κ΄κ΄κ³μ μ£ΌμΈλ§μ΄ μΈλν€λ₯Ό κ΄λ¦¬(λ±λ‘, μμ )
- μ£ΌμΈμ΄ μλ μͺ½μ μ½κΈ°λ§ κ°λ₯
- μ£ΌμΈμ mappedBy μμ± μ¬μ© x
- μ£ΌμΈμ΄ μλλ©΄ mappedBy μμ±μΌλ‘ μ£ΌμΈ μ§μ
κ·Έλ°λ° λꡬλ₯Ό μ£ΌμΈμΌλ‘ ν΄μΌνλ?
- μΈλν€κ° μλ κ³³μ μ£ΌμΈμΌλ‘ μ ν΄λΌ
- μ¬κΈ°μλ Member.teamμ΄ μ°κ΄κ΄κ³μ μ£ΌμΈ
μ°Έκ³ - μ€κ³
- μΌλ¨ λ¨λ°©ν₯μΌλ‘ λ€ μ€κ³λ₯Ό νκ³ μλ°©ν₯μ΄ νμν λ μλ°©ν₯μ μΆκ°νμ
- μλ°©ν₯μ μ‘°νλ₯Ό νΈνκ² νκΈ° μν΄ μ¬μ©νλ λλ
- μΈμ§ λΆμ‘°νκ° μκΈ°μ§ μμ
μλ°©ν₯ 맀νμ κ°μ₯ λ§μ΄ νλ μ€μ
- μ°κ΄κ΄κ³μ μ£ΌμΈμ κ°μ μ λ ₯νμ§ μμ
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member = new Member();
member.setName("amazzi");
member.setTeam(team);
em.persist(member);
- μ£ΌμΈμ κ°μ μ λ ₯νκΈ°
μλ°©ν₯ 맀νμ μ°κ΄κ΄κ³μ μ£ΌμΈμ κ°μ μ λ ₯ν΄μΌν¨
- μμν κ°μ²΄ κ΄κ³λ₯Ό κ³ λ €νλ©΄ νμ μμͺ½ λ€ κ°μ μ λ ₯ν΄μΌ ν¨
- μ€μ μ½λμλ μμͺ½ λ€ ν κ²μ κΆμ₯
μλ°©ν₯ 맀νμ μ₯μ
- λ¨λ°©ν₯ 맀νλ§μΌλ‘λ μ΄λ―Έ μ°κ΄κ΄κ³ 맀νμ μλ£
- μλ°©ν₯ 맀νμ λ°λ λ°©ν₯μΌλ‘ μ‘°ν(κ°μ²΄ κ·Έλν νμ) κΈ°λ₯μ΄ μΆκ°λ κ² λΏ
- JPQLμμ μλ°©ν₯μΌλ‘ νμν μΌμ΄ λ§μ
- λ¨λ°©ν₯ 맀νμ μνκ³ μλ°©ν₯μ νμν λ μΆκ°ν΄λ λ¨(ν μ΄λΈμ μν₯μ μ£Όμ§ μμ)
μ°κ΄ κ΄κ³ 맀ν μ΄λ Έν μ΄μ
- λ€λμΌ
@ManyToOne
- μΌλλ€
@OneToMany
- μΌλμΌ
@OneToOne
- λ€λλ€
@ManyToMany
@JoinColum
,@JoinTable
μμ κ΄κ³ 맀ν μ΄λ Έν μ΄μ
@Ingeritance
@DiscriminatorColumn
@DiscriminatorValue
@MappedSuperclass
: 맀ν μμ±λ§ μμ
볡ν©ν€ μ΄λ Έν μ΄μ
@IdClass
@EmbeddeId
@Embeddable
@MapsId
JPA λ΄λΆκ΅¬μ‘°
μμμ± μ»¨ν μ€νΈ
- μν°ν°λ₯Ό μꡬν μ μ₯νλ νκ²½
- μμμ± = μꡬν μ μ₯νλ μμ±
EntityManager.persist(entity)
- μμμ± μ»¨ν μ€νΈλ λ Όλ¦¬μ μΈ κ°λ (λμ 보μ΄μ§ μμ)
- μν°ν° 맀λμ λ₯Ό ν΅ν΄ μμμ± μ»¨ν μ€νΈμ μ κ·Ό
μ€νλ§ νλ μ μν¬μμμ μμμ± μ»¨ν μ€νΈ
- μν°ν° 맀λμ μ μμμ± μ»¨ν μ€νΈκ° N:1
- κ°μ νΈλμμ μ΄λ©΄ κ°μ μμμ± μ»¨ν μ€νΈμ μ κ·Ό
μν°ν° 맀λμ ν©ν 리μ μν°ν° 맀λμ
-
μμ²μ΄ λ€μ΄μ μ΄κ±Έ μ²λ¦¬νλ μ€λ λκ° νλ μμ±λ λλ§λ€ μλ‘μ΄ μν°ν° 맀λμ λ₯Ό λ§λ λ€.
-
μν°ν° 맀λμ μμ λ΄λΆμ μΌλ‘ λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ νμμ JPAλ₯Ό μ¬μ©
μν°ν°μ μλͺ μ£ΌκΈ°
λΉμμ (New)
- κ°μ²΄λ₯Ό μμ±ν μν
Team team = new Team();
team.setName("teamA");
μμ
- λΉμμ μνμΈ κ°μ²΄λ₯Ό μμμ± μ»¨ν μ€νΈμ μ μ₯ν μν
- μμμ± μ»¨ν μ€νΈ μμμ κ΄λ¦¬λκΈ° μμ
em.persist(team);
μ€μμ (Detached)
- μν°ν°λ₯Ό μμμ± μ»¨ν μ€νΈμμ λΆλ¦¬
em.detach(team);
- μμ -> μ€μμ
- μμ μνμ μν°ν°κ° μμμ± μ»¨ν μ€νΈμμ λΆλ¦¬
- μμμ± μ»¨ν μ€νΈκ° μ 곡νλ κΈ°λ₯μ μ¬μ© λͺ»ν¨
μ€μμ μνλ‘ λ§λλ λ°©λ²
em.detched(entity)
: νΉμ μν°ν°λ§ μ€μμ μνλ‘ μ νem.clear()
: μμμ± μ»¨ν μ€νΈλ₯Ό μμ ν μ΄κΈ°νem.close()
: μμμ± μ»¨ν μ€νΈλ₯Ό μ’ λ£
μμ
- κ°μ²΄λ₯Ό μμ ν μν
em.remove(team);
μμμ± μ»¨ν μ€νΈμ μ΄μ
1μ°¨ μΊμ
- μν°ν° 맀λμ μμ ν€ λ°Έλ₯λ‘ μΊμκ° λ¨
1μ°¨ μΊμμμ μ‘°ν
Member member = new Member();
member.setName("amazzi");
// 1μ°¨ μΊμμ μ μ₯λ¨
em.persist(member);
// 1μ°¨ μΊμμμ μ‘°ν
Memeber findMember = em.find(Member.class, "member1");
- DBλ₯Ό κ°μ§ μμ
- 1μ°¨ μΊμλ Global μΊμκ° μλ. νΈλμμ μμμλ§ λμνλ μΊμ
λ°μ΄ν° λ² μ΄μ€μμ μ‘°ν
Member findMember2 = em.find(Member.classm "member2");
λμΌμ± 보μ₯
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
a == b // λμΌμ± λΉκ΅ true
- 1μ°¨ μΊμλ‘ λ°λ³΅ κ°λ₯ν μ½κΈ° λ±κΈ(REPEATABLE READ) λ±κΈμ νΈλμμ 격리 μμ€μ DB κ° μλ μ ν리μΌμ΄μ μ°¨μμμ μ 곡
νΈλμμ μ μ§μνλ μ°κΈ° μ§μ°
em = entityManagerFactory.createEntityManager();
EntityTransaction transaction = em.getTransaction();
// μν°ν° 맀λμ λ λ°μ΄ν° λ³κ²½μ νΈλμμ
μ μμν΄μΌ ν¨
transaction.begin();
try {
em.persist(member1);
em.persist(member2);
// μ¬κΈ°κΉμ§ INSERT 쿼리λ₯Ό DBμ λ λ¦¬μ§ μμ
transaction.commit(); // νΈλμμ
컀λ°
em.flush();
em.clear();
} catch (Exception e) {
transaction.rollback();
}
- λ Όλ¦¬μ μΈ κ°λ . μ΄ λ Insert 쿼리λ₯Ό μμ λλλ€.
transcation.commit();
λ³κ²½ κ°μ§(Dirty Checking)
em = entityManagerFactory.createEntityManager();
EntityTransaction transaction = em.getTransaction();
// μν°ν° 맀λμ λ λ°μ΄ν° λ³κ²½μ νΈλμμ
μ μμν΄μΌ ν¨
transaction.begin();
try {
// μμ μν°ν° μ‘°ν
Member memberA = em.find(Member.class, "memberA");
// μμ μν°ν° λ°μ΄ν° μμ
memberA.setName("hi");
transaction.commit(); // νΈλμμ
컀λ°
em.flush(); // 쿼리λ₯Ό λ€ λ λ¦Ό
em.clear(); // μμμ± μ»¨ν
μ€νΈ μμ μλ μΊμλ₯Ό λ€ λ λ¦Ό
} catch (Exception e) {
transaction.rollback();
}
em.update(member)
μ΄λ° μ½λκ° μμ΄λ λ¨
- 1μ°¨ μΊμκ° μμ±λλ μκ° μ€λ μ·μ΄ μκΈ΄λ€.
- JPAλ νΈλμμ μ΄ μ»€λ°λλ μκ° μ€λ μ·κ³Ό 1μ°¨ μΊμμ μν°ν°λ₯Ό λΉκ΅ν΄μ λ°λ λμ κ°μ§νλ€.
- κ·Έλμ update 쿼리λ₯Ό λ λ¦Ό
μ μ΄λ κ² νμκΉ?
- μλ° μ»¬λ μ μμ λ°μ΄ν°λ₯Ό κ°μ Έμ€κ³ μ΄λ₯Ό λ³κ²½νλ©΄ 리μ€νΈμ μλ κ°μ΄ λ°λμ£ ?
- μ΄κ±°λ κ°μ λ§₯λ½
- κ·Έλμ λ°κΎΈκ³ 컀λ°λ§ μΉλ©΄ λλ€.
μν°ν° μμ
// μμ λμ° μν°ν° μ‘°ν
Member memberA = em.find(Member.class, "memberA");
em.remove(memberA); // μν°ν° μμ
- νΈλμμ μ»€λ° μμ μ μΏΌλ¦¬κ° λ λΌκ°
- λ²νΌλ₯Ό μ΅λν λ¦μΆλ€. (νΈλμμ 컀λ°ν λκΉμ§)
νλ¬μ
- μμμ± μ»¨ν μ€νΈμ λ³κ²½ λ΄μ©μ λ°μ΄ν°λ² μ΄μ€μ λ°μ
νλ¬μκ° λ°μλ λ
- λ³κ²½ κ°μ§
- μμ λ μν°ν° μ°κΈ° μ§μ° SQL μ μ₯μμ λ±λ‘
- μ°κΈ° μ§μ° SQL μ μ₯μμ 쿼리λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ‘ (λ±λ‘, μμ , μμ 쿼리)
νλ¬μνλ λ°©λ²
- em.flush() : μ§μ νΈμΆ
- νΈλμμ μ»€λ° : νλ¬μ μλ νΈμΆ
- JPQL 쿼리 μ€ν : νλ¬μ μλ νΈμΆ
JPQL 쿼리 μ€νμ νλ¬μκ° μλμΌλ‘ νΈμΆλλ μ΄μ
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// μ€κ°μ JPQL μ€ν // νλ¬μκ° λ¨Όμ μνλλ€.
query - em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
- 쿼리 μ€ν λ νλ¬μκ° μλλ©΄ DBμμ μ‘°νν΄μ¬ μ μκΈ° λλ¬Έ
- λ§μ½ λ§μ΄λ°ν°μ€λ JDBCλ₯Ό μ¬μ©νλ©΄ νλ¬μκ° μλ¨
νλ¬μλ!
- μμμ± μ»¨ν μ€νΈλ₯Ό λΉμ°μ§ μμ
- μμμ± μ»¨ν μ€νΈμ λ³κ²½ λ΄μ©μ λ°μ΄ν°λ² μ΄μ€μ λκΈ°ν
- νΈλμμ μ΄λΌλ μμ λ¨μκ° μ€μ -> μ»€λ° μ§μ μλ§ λκΈ°ν νλ©΄ λ¨
μ§μ° λ‘λ©(Lazy Loading)
μ§μ°λ‘λ©κ³Ό μμμ± μ»¨ν μ€νΈ
- Memberλ₯Ό μ‘°νν λ Teamλ ν¨κ» μ‘°νν΄μΌ ν κΉ?
- λ¨μν member μ λ³΄λ§ μ¬μ©νλ λΉμ¦λμ€ λ‘μ§μ΄λΌλ©΄β¦ 미리 μ‘°νν νμκ° μκ² μ£
member.getName()
- μ΄λ¬λ©΄ FetchType.Lazyλ‘ μ§μ°λ‘λ©μ κ±Έμ
- Memberλ₯Ό μ‘°νν λ Teamμ κ°μ§ κ°μ²΄(νλ‘μ κ°μ²΄)κ° λ€μ΄κ°
μ¦μλ‘λ©
- FetchType.EAGER
- Memberλ₯Ό μ‘°νν λ Teamλ ν¨κ» μ‘°ν
νλ‘μμ μ¦μλ‘λ© μ£Όμ
- κ°κΈμ μ§μ° λ‘λ©μ μ¬μ©
- μ¦μ λ‘λ©μ μ μ©νλ©΄ μμνμ§ λͺ»ν SQLμ΄ λ°μ
- μ¦μ λ‘λ©μ JPQLμμ N+1 λ¬Έμ λ₯Ό μΌμΌν΄
@ManyToOne
,@OneToOne
μ κΈ°λ³Έμ΄ μ¦μ λ‘λ©- LAZYλ‘ μ€μ νκΈ°
@OneToMany
,@ManyToMany
λ κΈ°λ³Έμ΄ μ§μ° λ‘λ©- μ€νλ§μμλ νΈλμμ
μ΄ λλκ³ μ»¨νΈλ‘€λ¬μμ LAZY λ‘λ© νλ €κ³ ν λ λ¬Έμ μκΉ
- Open Session In View
- μ μ΄κ² μ΄μ μλΏλ€