Almost every Java developer knows ORM concepts and Hibernate as the most popular solution in Java world in this area. But it is big surprise that very small percent of Java developers (even experienced ones) can answer very simple questions about how Hibernate really do all this “magic”. In this live coding session we will go through many practical samples and finally show truth to the Java community. ;)
P.S. After this talk you could pass through any Senior Developer interview easily.
Code samples can be found here: https://github.com/xpinjection/hibernate-basics
.
14. #3. What about collections?
• Collections affect performance
• All relations are lazy by default
• Some works not like you expect
• Merging values is always a pain
• Extra laziness is available
15.
16. #4. But what was changed?
• Dirty checking is applied:
– Default approach based on
properties with reflection
– Optimized with bytecode
instrumentation
– Manual with
SelfDirtyCheckingEntity
17.
18. #5. But when real queries run?
• Predefined order of queries is applied
– inserts
– updates
– deletions of collections elements
– inserts of the collection elements
– deletes
• Flush mode AUTO tries to be “smart”
TODO: поставить правильную ссылку и перегенерить QR код
На демо показываем:
запрос действительно не идет дополнительный при lazy loading
для коллекции идет при доступе к ней
для компонента отдельно !!! не показываем
метод load возвращает не объект, а прокси и на нем дергаем получение поля, после чего идет запрос в базу
На демо показываем:
что load возвращает действительно прокси (в дебаге)
на many-to-one генерируется прокси
На демо показываем:
проблему N+1
работу коллекции в extra lazy режиме
указание явного JOIN в запросе или сессии !!! не показываем
замена персистентной коллекции при мерже объекта извне
На демо показываем:
как работает проверка по всем сущностям и всем полям
как ее отключить для запроса, транзакции, сессии (ридонли, имьютабл и StatelessSession)
как включить оптимизированный вариант в Hibernate 5
как сделать ручной вариант с SelfDirtyCheckingEntity (на домашнее задание) !!! не стоит показывать
На демо показываем:
несколько запросов разного типа и потом на FLUSH их реальное выполнение в определенном порядке
как не срабатывает AUTO FLUSH если выполняется SELECT NATIVE QUERY на табличку, в которую только что сделали инсерт
удаление при наследовании создает темповую табличку !!! не показываем
апдейт генерирует запрос на все поля даже если поменялось только одно