Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет! ✌️
Сегодня мы вновь соберемся с @Shikin_Anatoliy, в 16:00 по МСК в Яндекс.Телемост, чтобы закончить тестовое задание по написанию футбольного сервиса.⚽️
Приходите и учитесь вместе с нами! 💪
Ждем всех 🫵
Сегодня мы вновь соберемся с @Shikin_Anatoliy, в 16:00 по МСК в Яндекс.Телемост, чтобы закончить тестовое задание по написанию футбольного сервиса.
Приходите и учитесь вместе с нами! 💪
Ждем всех 🫵
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Пишем тестовое задание от реального работодателя для новичков! Часть 2 (начало).
Встреча от 13.04.25
Запись встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече наш подписчик @Shikin_Anatoliy рискнул продолжить писать тестовое задание от реального работодателя.
Что мы успели в рамках второй серии:
- Доработали Player
- Создали CRUD для Team
- Все простестили и проработали
Допустили и решили пару систематических ошибок, повторили основы написания.
Ждите продолжения!
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
@Shikin_Anatoliy - респект и уважуха💪
Встреча от 13.04.25
Запись встречи -
YOUTUBE
RUTUBE
На сегодняшней встрече наш подписчик @Shikin_Anatoliy рискнул продолжить писать тестовое задание от реального работодателя.
Что мы успели в рамках второй серии:
- Доработали Player
- Создали CRUD для Team
- Все простестили и проработали
Допустили и решили пару систематических ошибок, повторили основы написания.
Ждите продолжения!
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
@Shikin_Anatoliy - респект и уважуха
Please open Telegram to view this post
VIEW IN TELEGRAM
@LazyCollection в Hibernate
Аннотация @LazyCollection управляет стратегией ленивой загрузки для коллекций (например, @OneToMany, @ManyToMany) в Hibernate. Определяет, когда и как должны загружаться связанные сущности.
Пакет: org.hibernate.annotations
Применяется к: полям-коллекциям (List, Set, Map и др.) с аннотациями @OneToMany или @ManyToMany.
Параметры и настройки
Аннотация принимает один обязательный параметр — value, который может быть одним из следующих вариантов:
LazyCollectionOption.TRUE (по умолчанию для @OneToMany и @ManyToMany):
Коллекция загружается лениво (при первом обращении).
Используется прокси-объект (PersistentBag, PersistentSet).
LazyCollectionOption.EXTRA:
"Сверхленивая" загрузка: Hibernate загружает только необходимые данные при вызове методов коллекции (например, size(), contains()).
Полезно для больших коллекций, чтобы избежать полной загрузки.
LazyCollectionOption.FALSE:
Коллекция загружается жадно (eager loading), аналогично fetch = FetchType.EAGER.
Не рекомендуется для больших коллекций из-за риска N+1 проблемы.
Жизненный цикл и обработка
Инициализация прокси:
При загрузке родительской сущности коллекция заменяется прокси (реализацией Hibernate).
Прокси перехватывает вызовы методов (например, getItems()) и загружает данные.
Загрузка данных:
Для TRUE: при первом обращении к коллекции выполняется SQL-запрос.
Для EXTRA: методы вроде size() генерируют SELECT COUNT(*), а не загружают все элементы.
Сессия и LazyInitializationException:
Если коллекция запрашивается после закрытия сессии, возникнет исключение (если не используется OpenSessionInView).
Механизмы Hibernate и Spring Boot
Глобальная настройка ленивой загрузки:
Параметр spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true (не рекомендуется, приводит к N+1).
spring.jpa.open-in-view=true (держит сессию открытой до конца HTTP-запроса).
Интеграция с FetchType:
@LazyCollection переопределяет поведение fetch в @OneToMany:
Оптимизация запросов:
Для EXTRA Hibernate использует:
SELECT COUNT(*) FROM orders WHERE user_id = ? — для collection.size().
SELECT id FROM orders WHERE user_id = ? LIMIT 1 — для collection.isEmpty().
Примеры использования
Ленивая загрузка с проверкой размера без загрузки элементов:
Отключение ленивой загрузки (редкий случай):
Ограничения и лучшие практики
N+1 проблема: Даже с LazyCollectionOption.TRUE при обходе коллекции (for (Order o : user.getOrders())) выполняется один запрос для загрузки всех элементов. Решение: @EntityGraph или JOIN FETCH.
EXTRA не поддерживает List.get(index): Для этого требуется полная загрузка.
Тестирование: В тестах с закрытой сессией используйте Hibernate.initialize(collection).
#Java #Training #Hard #Spring #Hibernate #LazyCollection
Аннотация @LazyCollection управляет стратегией ленивой загрузки для коллекций (например, @OneToMany, @ManyToMany) в Hibernate. Определяет, когда и как должны загружаться связанные сущности.
Пакет: org.hibernate.annotations
Применяется к: полям-коллекциям (List, Set, Map и др.) с аннотациями @OneToMany или @ManyToMany.
Параметры и настройки
Аннотация принимает один обязательный параметр — value, который может быть одним из следующих вариантов:
LazyCollectionOption.TRUE (по умолчанию для @OneToMany и @ManyToMany):
Коллекция загружается лениво (при первом обращении).
Используется прокси-объект (PersistentBag, PersistentSet).
LazyCollectionOption.EXTRA:
"Сверхленивая" загрузка: Hibernate загружает только необходимые данные при вызове методов коллекции (например, size(), contains()).
Полезно для больших коллекций, чтобы избежать полной загрузки.
LazyCollectionOption.FALSE:
Коллекция загружается жадно (eager loading), аналогично fetch = FetchType.EAGER.
Не рекомендуется для больших коллекций из-за риска N+1 проблемы.
Жизненный цикл и обработка
Инициализация прокси:
При загрузке родительской сущности коллекция заменяется прокси (реализацией Hibernate).
Прокси перехватывает вызовы методов (например, getItems()) и загружает данные.
Загрузка данных:
Для TRUE: при первом обращении к коллекции выполняется SQL-запрос.
Для EXTRA: методы вроде size() генерируют SELECT COUNT(*), а не загружают все элементы.
Сессия и LazyInitializationException:
Если коллекция запрашивается после закрытия сессии, возникнет исключение (если не используется OpenSessionInView).
Механизмы Hibernate и Spring Boot
Глобальная настройка ленивой загрузки:
Параметр spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true (не рекомендуется, приводит к N+1).
spring.jpa.open-in-view=true (держит сессию открытой до конца HTTP-запроса).
Интеграция с FetchType:
@LazyCollection переопределяет поведение fetch в @OneToMany:
@OneToMany(fetch = FetchType.EAGER) // Игнорируется, если есть @LazyCollection
@LazyCollection(LazyCollectionOption.TRUE)
private List<Order> orders;
Оптимизация запросов:
Для EXTRA Hibernate использует:
SELECT COUNT(*) FROM orders WHERE user_id = ? — для collection.size().
SELECT id FROM orders WHERE user_id = ? LIMIT 1 — для collection.isEmpty().
Примеры использования
Ленивая загрузка с проверкой размера без загрузки элементов:
@OneToMany
@LazyCollection(LazyCollectionOption.EXTRA)
private Set<Comment> comments; // Для comments.size() не загружает все комментарии
Отключение ленивой загрузки (редкий случай):
@OneToMany
@LazyCollection(LazyCollectionOption.FALSE) // Аналог FetchType.EAGER
private List<Post> posts;
Ограничения и лучшие практики
N+1 проблема: Даже с LazyCollectionOption.TRUE при обходе коллекции (for (Order o : user.getOrders())) выполняется один запрос для загрузки всех элементов. Решение: @EntityGraph или JOIN FETCH.
EXTRA не поддерживает List.get(index): Для этого требуется полная загрузка.
Тестирование: В тестах с закрытой сессией используйте Hibernate.initialize(collection).
#Java #Training #Hard #Spring #Hibernate #LazyCollection
Что выведет код?
#Tasks
import java.util.HashMap;
public class Task140425 {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put(null, 1);
map.put("null", 2);
map.put(null, 3);
System.out.println(map.get(null) + " " + map.get("null"));
}
}
#Tasks
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩💻
Какой метод используется для преобразования строки в массив символов?
Какой метод используется для преобразования строки в массив символов?
Anonymous Quiz
4%
getChars()
83%
toCharArray()
6%
split()
6%
chars()
@LazyToOne в Hibernate
Аннотация @LazyToOne управляет стратегией ленивой загрузки для ассоциаций @ManyToOne и @OneToOne в Hibernate. В отличие от стандартного FetchType.LAZY, она позволяет более гибко настраивать механизм проксирования и инициализации связанных сущностей.
Пакет: org.hibernate.annotations
Применяется к: полям или методам с аннотациями @ManyToOne или @OneToOne.
1. Параметры и настройки
Аннотация @LazyToOne принимает один обязательный параметр — value, который может быть одним из следующих вариантов:
Доступные варианты загрузки:
LazyToOneOption.PROXY (по умолчанию, если FetchType.LAZY):
Создается прокси-объект, который загружает данные только при первом обращении.
Если связанная сущность уже удалена (и @ManyToOne nullable), может возникнуть LazyInitializationException.
LazyToOneOption.NO_PROXY:
Использует байткодовую модификацию (требует инструментирования, например, через javassist).
Позволяет избежать некоторых проблем с прокси, но сложнее в настройке.
LazyToOneOption.FALSE:
Эквивалентно FetchType.EAGER — загружает сущность сразу.
2. Жизненный цикл и обработка
При загрузке сущности:
Если PROXY → Hibernate подставляет прокси-объект, не загружая данные из БД.
Если NO_PROXY → генерируется специальный подкласс (требует hibernate.bytecode.provider=javassist).
При первом обращении:
Прокси инициализируется и выполняет SQL-запрос.
При закрытии сессии:
Если сессия закрыта до обращения к полю → LazyInitializationException.
Отличие от стандартного FetchType.LAZY
Обычный LAZY в @ManyToOne/@OneToOne не всегда работает (особенно если optional=false).
@LazyToOne дает больше контроля над механизмом ленивой загрузки.
3. Механизмы Hibernate и Spring Boot
Настройки, влияющие на @LazyToOne
hibernate.bytecode.provider (для NO_PROXY):
Открытие сессии в View (OpenSessionInView)
``
spring.jpa.open-in-view=true # Держит сессию открытой до конца HTTP-запроса
Позволяет избежать LazyInitializationException в веб-приложениях.
```
Глобальная настройка ленивой загрузки
4. Примеры использования
Пример 1: Ленивая загрузка с прокси (PROXY)
Пример 2: Ленивая загрузка без прокси (NO_PROXY)
#Java #Training #Hard #Spring #Hibernate #LazyToOne
Аннотация @LazyToOne управляет стратегией ленивой загрузки для ассоциаций @ManyToOne и @OneToOne в Hibernate. В отличие от стандартного FetchType.LAZY, она позволяет более гибко настраивать механизм проксирования и инициализации связанных сущностей.
Пакет: org.hibernate.annotations
Применяется к: полям или методам с аннотациями @ManyToOne или @OneToOne.
1. Параметры и настройки
Аннотация @LazyToOne принимает один обязательный параметр — value, который может быть одним из следующих вариантов:
Доступные варианты загрузки:
LazyToOneOption.PROXY (по умолчанию, если FetchType.LAZY):
Создается прокси-объект, который загружает данные только при первом обращении.
Если связанная сущность уже удалена (и @ManyToOne nullable), может возникнуть LazyInitializationException.
LazyToOneOption.NO_PROXY:
Использует байткодовую модификацию (требует инструментирования, например, через javassist).
Позволяет избежать некоторых проблем с прокси, но сложнее в настройке.
LazyToOneOption.FALSE:
Эквивалентно FetchType.EAGER — загружает сущность сразу.
2. Жизненный цикл и обработка
При загрузке сущности:
Если PROXY → Hibernate подставляет прокси-объект, не загружая данные из БД.
Если NO_PROXY → генерируется специальный подкласс (требует hibernate.bytecode.provider=javassist).
При первом обращении:
Прокси инициализируется и выполняет SQL-запрос.
При закрытии сессии:
Если сессия закрыта до обращения к полю → LazyInitializationException.
Отличие от стандартного FetchType.LAZY
Обычный LAZY в @ManyToOne/@OneToOne не всегда работает (особенно если optional=false).
@LazyToOne дает больше контроля над механизмом ленивой загрузки.
3. Механизмы Hibernate и Spring Boot
Настройки, влияющие на @LazyToOne
hibernate.bytecode.provider (для NO_PROXY):
spring.jpa.properties.hibernate.bytecode.provider=javassist
Без этого NO_PROXY может не работать.
Открытие сессии в View (OpenSessionInView)
``
spring.jpa.open-in-view=true # Держит сессию открытой до конца HTTP-запроса
Позволяет избежать LazyInitializationException в веб-приложениях.
```
Глобальная настройка ленивой загрузки
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true # Не рекомендуется!
(Может привести к N+1 и утечкам памяти.)
4. Примеры использования
Пример 1: Ленивая загрузка с прокси (PROXY)
@Entity
public class Order {
@ManyToOne(fetch = FetchType.LAZY) // Стандартный LAZY
@LazyToOne(LazyToOneOption.PROXY) // Явное указание прокси
private User user;
}
Пример 2: Ленивая загрузка без прокси (NO_PROXY)
@Entity
public class Employee {
@OneToOne(fetch = FetchType.LAZY)
@LazyToOne(LazyToOneOption.NO_PROXY) // Требует инструментирования
private ParkingSpot parkingSpot;
}
#Java #Training #Hard #Spring #Hibernate #LazyToOne