JPAдеги FetchType.LAZY эмне жана ал байланыштуу объекттердин жүктөлүшүнө кандай таасир этет?
AIден жооп
sobes.tech AI
FetchType.LAZY JPA-де байланышкан объекттердин кечиктирилген жүктөлүшүн билдирет. Негизги объектти алуу учурунда, байланышкан коллекция же отделдүү объект жүктөлбөйт, JPA прокси объектисин түзөт. Чындык маалымат базадан биринчи жолу прокси объекттин талааларына же методдоруна кайрылганда жүктөлөт.
Бул төмөнкүлөргө мүмкүндүк берет:
- Өнүмдүүлүктү оптималдаштыруу: Колдонулбай турган чоң маалыматтарды базадан алуу алдын алуу.
- Эстутун колдонуу азайтуу: Керектүү гана маалыматтарды жүктөө.
Көпчүлүк байланыштар үчүн (@OneToMany, @ManyToMany) FetchType.LAZY колдонулат, жана @OneToOne жана @ManyToOne үчүн — FetchType.EAGER. Төмөнкүдөй түрдө жүктөө түрүн так көрсөтсө болот:
// FetchType.LAZY колдонуу мисалы
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
private Set<ChildEntity> children;
@ManyToOne(fetch = FetchType.LAZY)
private ParentEntity parent;
FetchType.LAZY менен байланышкан көйгөйлөр:
- LazyInitializationException: Эгер сиз, ал жүктөлгөндөн кийин, сессия жабылганда, жеткиликтүү болбогон объектке кирүүгө аракет кылсаңыз, пайда болот.
- N+1 көйгөйү: Эгер сиз кечиктирилген жүктөө менен коллекция аркылуу өтүп, ар бир байланышкан объектке кирсеңиз, ар бир үчүн жеке суроо-талап болот.
Бул көйгөйлөрдү чечүү үчүн:
-
JOIN FETCHколдонуп, байланышкан маалыматтарды так алуу:// JOIN FETCH мисалы SELECT p FROM ParentEntity p JOIN FETCH p.children WHERE p.id = :parentId -
JPA провайдеринин конфигурацияларын (мисалы, batching колдонуу).
-
Hibernate'де
@Fetch(FetchMode.JOIN)же@Fetch(FetchMode.SELECT)аннотациясын колдонуу.