Ko nozīmē FetchType.LAZY JPA un kā tas ietekmē saistīto entītu ielādi?
Atbilde no AI
sobes.tech AI
FetchType.LAZY JPA nozīmē saistīto entitāšu atlikto ielādi. Tā vietā, lai ielādētu visu saistīto kolekciju vai atsevišķu entītu, kad tiek iegūta galvenā entītija, JPA izveido proxy objektu. Faktiska datu ielāde no datu bāzes notiek tikai pirmo reizi, kad tiek piekļūts proxy objekta laukiem vai metodēm.
Tas ļauj:
- Optimizēt veiktspēju: Izvairīties no liela datu apjoma iegūšanas no datu bāzes, ja tie nav nepieciešami.
- Samazināt atmiņas patēriņu: Ielādēt tikai nepieciešamos datus.
Lielākajai daļai saistību (@OneToMany, @ManyToMany) pēc noklusējuma tiek izmantots FetchType.LAZY, bet @OneToOne un @ManyToOne – FetchType.EAGER. Jūs varat skaidri norādīt ielādes tipu:
// Piemērs ar FetchType.LAZY
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
private Set<ChildEntity> children;
@ManyToOne(fetch = FetchType.LAZY)
private ParentEntity parent;
Problēmas ar FetchType.LAZY:
- LazyInitializationException: var rasties, ja mēģināsiet piekļūt atlikt ielādētai entītijai pēc sesijas slēgšanas, kurā tā tika ielādēta.
- N+1 problēma: ja iterējat pār kolekciju ar atliktu ielādi un piekļūstat katrai saistītajai entītijai, katrai kolekcijas entītijai tiks veikts atsevišķs vaicājums uz datu bāzi.
Lai risinātu šīs problēmas, var izmantot:
-
Skaidru saistīto datu iegūšanu ar
JOIN FETCHJPQL:// Piemērs ar JOIN FETCH SELECT p FROM ParentEntity p JOIN FETCH p.children WHERE p.id = :parentId -
JPA nodrošinātāja iestatījumus (piemēram, izmantojot batching).
-
@Fetch(FetchMode.JOIN)vai@Fetch(FetchMode.SELECT)anotācijas Hibernate.