ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ содСрТимому
ΠœΠ°ΠΊΡΠΈΠΌΠ΅Ρ‚Π΅Ρ€

🧠 Как Π½Π΅ ΡΠ»ΠΎΠ²ΠΈΡ‚ΡŒ LazyInitializationException Π² Spring Boot + Hibernate

🧠 Как Π½Π΅ ΡΠ»ΠΎΠ²ΠΈΡ‚ΡŒ LazyInitializationException Π² Spring Boot + Hibernate Одна ΠΈΠ· самых частых ошибок ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с JPA: org.hibernate.LazyInitializationException: failed to lazily initialize a collection πŸ“Œ ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°: Π»Π΅Π½ΠΈΠ²ΠΎ загруТаСмая коллСкция (LAZY) обращаСтся ΠΊ Π‘Π” Π²Π½Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² слоС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° ΠΈΠ»ΠΈ послС закрытия Session. πŸ’‘ Как ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ? βœ… РСшСниС 1: @Transactional Π² сСрвисС Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ ΠΊ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ коллСкциям Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° с @Transactional: @Transactional public UserDto getUser(Long id) { User user = userRepository.findById(id) .orElseThrow(); // OK: коллСкция friends Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ return new UserDto(user.getName(), user.getFriends()); } ⚠️ НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ @Transactional Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ… - это плохая ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°. βœ… РСшСниС 2: Fetch Join ΠŸΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ сразу Ρ‡Π΅Ρ€Π΅Π· JOIN FETCH: @Query("SELECT u FROM User u LEFT JOIN FETCH u.friends WHERE u.id = :id") Optional<User> findByIdWithFriends(@Param("id") Long id); πŸ“Œ Плюс: 1 запрос вмСсто N (N+1 ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ). πŸ“Œ ΠœΠΈΠ½ΡƒΡ: ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ избыточная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°, особСнно с большими коллСкциями. βœ… РСшСниС 3: DTO проСкция Π›ΡƒΡ‡ΡˆΠΈΠΉ способ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв - ΠΏΡ€ΠΎΠ΅Ρ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сразу Π² DTO: @Query(""" SELECT new com.example.UserDto(u.name, f.name) FROM User u LEFT JOIN u.friends f WHERE u.id = :id """) List<UserDto> findUserWithFriendNames(@Param("id") Long id); πŸ“Œ Π’Ρ‹Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. Быстро, бСзопасно, эффСктивно. ЛСнивая инициализация - ΠΎΠΊ, Ссли Π²Ρ‹ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. ΠŸΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΈ ΠΈ fetch join - ваши Π»ΡƒΡ‡ΡˆΠΈΠ΅ Π΄Ρ€ΡƒΠ·ΡŒΡ, Ссли Π½ΡƒΠΆΠ΅Π½ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. πŸ‘‰ @BookJava

549 просмотров

Канал Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠœΠ°ΠΊΡΠΈΠΌΠ΅Ρ‚Π΅Ρ€Π°

1Β 609 подписчиков Β· Наука

Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠ°Π½Π°Π»Π°

ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½Ρ‹Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠ°Π½Π°Π»Π°

Π•Ρ‰Ρ‘ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅ «Наука»

Π§ΠΈΡ‚Π°Ρ‚ΡŒ дальшС

Π”Π²Π° Ρ€Π°Π·Π° Π² нСдСлю свСТиС посты этого ΠΊΠ°Π½Π°Π»Π° β€” Π½Π° ΠΏΠΎΡ‡Ρ‚Ρƒ ΠΈ Π² Π»ΠΈΡ‡Π½ΡƒΡŽ Π»Π΅Π½Ρ‚Ρƒ. Π‘Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ поиска ΠΊΠ°Π½Π°Π»Π° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.