Я использую Hibernate как реализацию JPA. В моем приложении vaadin EntityManager
является областью действия запроса (чтобы избежать неконтролируемого фиксации накопленных изменений). Я храню отдельный элемент в сеансе и повторно подключаю его каждый раз, когда это необходимо в запросе (один раз за запрос, я проверяю это, используя em.contains()
). Entity ссылается на другой объект, который ссылается на другой, поэтому в конце я имею трехуровневый каскадный диаграмму дерева с указанным объектом с сессией в виде корня.EntityManager.merge (x) вызывает запрос «select» к DB
Это работает отлично, пока я не большое совершенно новое дерево с совершенно новыми узлами (всего более 5000 наименований) - Hibernate пытается найти каждый новый узел по слиянию (я могу видеть свои попытки в моих журналах - много select
комиссионки неиспользуемые идентификаторы). Это ошибка, или я просто злоупотребляю JPA?
Update
Я не использую @Version
поле.
Update *
В моем приложении я использую тот же подход для хранения всех поддеревьев сущностей независимо от структуры каскадных отношений, поэтому я не могу различать между различными вариантами использования, и поэтому я использую слияния.
У вас есть '@ Version'fields? Можете ли вы показать соответствующие части ваших объектов (поля идентификатора и отношения между ними)? –
@Andrei Я не использую поля '@ Version' (как я думал, это необходимо только при работе с блокировкой записей). Есть ли какие-либо последствия или правила для использования поля '@ Version'? (обновленное описание) –
Никаких специальных правил (помимо типа), но последствия могут быть (в зависимости от реализации), поскольку Оптимистическая блокировка означает сравнение поля '@ Version' с текущими данными в БД (что может означать выбор) , Вы ничего не публиковали из своего кода. –