π λ€μ΄κ°λ©°
JPAμ μ§μ° λ‘λ©μ νλ‘μ(Proxy) κ°μ²΄ μμμ λμνλ€. νλ‘μλ μ€μ μν°ν°λ₯Ό λμ νλ κ°μ§ κ°μ²΄λ‘, μ€μ λ‘ μ¬μ©λ λ μ΄κΈ°νλμ΄ μ§μ§ μν°ν°μ μ κ·Όνλ€.
em.getReference()λ μ€μ μν°ν°κ° μλλΌ νλ‘μ κ°μ²΄λ₯Ό λ°ννλ€. (em.find()λ μ€μ μν°ν°)
1. νλ‘μμ νΉμ§ β ν λ²λ§ μ΄κΈ°ν
1
2
3
4
5
6
| Member findMember = em.getReference(Member.class, member.getId());
System.out.println(findMember.getClass()); // νλ‘μ κ°μ²΄
System.out.println(findMember.getId()); // 쿼리 μ λκ° (idλ μ΄λ―Έ μ)
System.out.println(findMember.getUsername()); // β
μ¬κΈ°μ 쿼리 λ°μ! (μ€μ κ° νμ)
System.out.println(findMember.getClass()); // μ¬μ ν νλ‘μ!
|
π‘ νλ‘μλ μ²μ μ¬μ©ν λ ν λ²λ§ μ΄κΈ°νλλ€. μ€μν 건, νλ‘μκ° μ€μ μν°ν°λ‘ λ°λλ κ² μλλΌ μ€μ μν°ν°μ μ κ·Όν μ μκ² λ§ν¬λλ κ²μ΄λ€. getReference()λ‘ κ°μ Έμ¨ κ°μ²΄λ μ΄κΈ°ν νμλ κ³μ νλ‘μλ€.
2. β οΈ νμ
λΉκ΅λ instanceof
νλ‘μ λλ¬Έμ == λΉκ΅κ° μμκ³Ό λ€λ₯΄κ² λμ¬ μ μλ€.
1
2
3
4
5
| // λ λ€ find β κ°μ μ€μ μν°ν° ν΄λμ€
em.find(...).getClass() == em.find(...).getClass() // true
// find vs getReference β μ€μ μν°ν° vs νλ‘μ
em.find(...).getClass() == em.getReference(...).getClass() // false!
|
β οΈ κ·Έλμ νμ
λΉκ΅λ ==κ° μλλΌ instanceofλ₯Ό μ¨μΌ νλ€.
1
2
| findMember instanceof Member // true (μ€μ λ νλ‘μλ )
findMember2 instanceof Member // true
|
3. μμμ± μ»¨ν
μ€νΈμ νλ‘μ
| μν© | κ²°κ³Ό |
|---|
| μ΄λ―Έ μμμ± μ»¨ν
μ€νΈμ μν°ν°κ° μμΌλ©΄ | getReference()λ μ€μ μν°ν° λ°ν |
| μ΄λ―Έ νλ‘μκ° μμΌλ©΄ | find()λ νλ‘μ λ°ν |
π‘ JPAλ κ°μ μμμ± μ»¨ν
μ€νΈμμ κ°μ μλ³μλ©΄ νμ κ°μ κ°μ²΄(==)μμ 보μ₯νλ€. κ·Έλμ μ΄λ―Έ μλ κ²κ³Ό νμ
μ λ§μΆλ € νλ€. (find λ¨Όμ λ©΄ μ€μ , getReference λ¨Όμ λ©΄ νλ‘μλ‘ ν΅μΌ)
4. β οΈ μ€μμ μνμ νλ‘μ μ΄κΈ°ν
1
2
3
| Member findMember = em.getReference(Member.class, member.getId());
em.detach(findMember); // μ€μμ μνλ‘
String username = findMember.getUsername(); // β
μμΈ λ°μ!
|
1
2
| org.hibernate.LazyInitializationException:
could not initialize proxy - no Session
|
β οΈ νλ‘μ μ΄κΈ°νλ μμμ± μ»¨ν
μ€νΈμ κ΄λ¦¬κ° νμνλ€. detach/clear/νΈλμμ
μ’
λ£ λ±μΌλ‘ μ€μμ μνκ° λλ©΄ μ΄κΈ°ν μ LazyInitializationExceptionμ΄ λ°μνλ€.
5. νλ‘μ μν νμΈΒ·κ°μ μ΄κΈ°ν
1
2
3
4
5
6
7
| // μ΄κΈ°ν μ¬λΆ νμΈ
emf.getPersistenceUnitUtil().isLoaded(findMember); // false
findMember.getUsername(); // μ΄κΈ°ν λ°μ
emf.getPersistenceUnitUtil().isLoaded(findMember); // true
// κ°μ μ΄κΈ°ν
Hibernate.initialize(findMember);
|
π μ 리
1
2
3
4
5
6
| JPA νλ‘μ
ββ νΉμ§ ν λ²λ§ μ΄κΈ°ν, getReference()κ° λ°ν
ββ λ³Έμ§ μ€μ μν°ν°λ‘ λ°λμ§ μκ³ 'μ κ·Ό'λ§ κ°λ₯
ββ λΉκ΅ == λμ instanceof μ¬μ©
ββ 컨ν
μ€νΈ κ°μ μλ³μλ©΄ κ°μ κ°μ²΄λ‘ ν΅μΌ
ββ μ£Όμ μ€μμ μν μ΄κΈ°ν β LazyInitializationException
|
| κ°λ
| ν μ€ μ μ |
|---|
| νλ‘μ | μ€μ μν°ν°λ₯Ό λμ νλ κ°μ§ κ°μ²΄ |
| getReference | νλ‘μλ₯Ό λ°ν |
| instanceof | νλ‘μ/μ€μ 무κ΄νκ² νμ
λΉκ΅ |
| LazyInitializationException | μ€μμ νλ‘μ μ΄κΈ°ν μ€ν¨ |
νλ‘μλ μ§μ° λ‘λ©μ ν΅μ¬ λ©μ»€λμ¦μ΄λ€. βνλ‘μλ μ€μ μν°ν°λ‘ λ°λμ§ μλλ€βλ μ , κ·Έλμ νμ
λΉκ΅λ instanceofλ‘ ν΄μΌ νλ€λ μ , κ·Έλ¦¬κ³ μ€μμ μνμμ μ΄κΈ°ννλ©΄ μμΈκ° λλ€λ μ λ§ μ‘μΌλ©΄ μ§μ° λ‘λ©μ μμ νκ² λ€λ£° μ μλ€.
Comments powered by Disqus.