Как включить переплетение времени загрузки/времени выполнения с помощью Hibernate JPA и Spring Framework

Я использую Hibernate в качестве поставщика JPA (я использую его EntityManagerFactory вместо SessionFactory) в приложении Spring Framework. Мне удалось заставить работать поддержку переплетения времени загрузки Spring Framework, поэтому я преодолел это препятствие.

Мне нужно включить ленивую загрузку свойств byte[] и @ManyToOne объекта. Я понимаю, как инструментировать (сплетать) свои сущности во время сборки с помощью задачи ant Hibernate, но вместо этого я хотел бы инструментировать свои сущности во время времени выполнения (сплетение во время загрузки). Я видел ссылки на in в нескольких результатах поиска Google, но не нашел реальных инструкций по его включению. Какое свойство мне нужно установить, чтобы указать Hibernate, что он может управлять моими сущностями во время выполнения?


person Nick Williams    schedule 24.08.2013    source источник


Ответы (2)


После значительного чтения кода и отладки я понял это. Жаль, что документация Hibernate ORM не включает эту информацию. (Честно говоря, документация Hibernate EntityManager есть, но его нелегко найти. В инструкциях Hibernate по теме «Использование отложенной выборки свойств» говорится только: «Для отложенной загрузки свойств требуется инструментирование байт-кода во время сборки». со свойством Hibernate EntityManager.)

Первое, что вы должны сделать, это установить для свойства "hibernate.ejb.use_class_enhancer" JPA значение "true" (String). Это сообщает Hibernate, что он может использовать преобразование класса «сервер приложений», вызывая addTransformer для экземпляра PersistenceUnitInfo. Преобразование класса «сервер приложений» на самом деле является Spring LoadTimeWeaver. Если вы используете конфигурацию Java Spring и LocalContainerEntityManagerFactoryBean, а Hibernate является зависимостью времени компиляции, вы можете использовать константу AvailableSettings.USE_CLASS_ENHANCER вместо строкового литерала "hibernate.ejb.use_class_enhancer" (что сделает его устойчивым к опечаткам).

Если вы используете конфигурацию Java Spring, необходимо выполнить дополнительный шаг, пока SPR-10856 не будет исправлено. Метод setLoadTimeWeaver LocalContainerEntityManagerFactoryBean не вызывается автоматически, как должно быть, поэтому вы должны вызывать его вручную. В вашем классе @Configuration просто @Inject или @Autowire экземпляр LoadTimeWeaver и вызовите setLoadTimeWeaver вручную при создании класса LocalContainerEntityManagerFactoryBean.

Выполнив эти шаги, я теперь использую инструментарий байт-кода объекта среды выполнения Hibernate с Spring Framework в Tomcat.

person Nick Williams    schedule 24.08.2013
comment
Бился головой о стену, пытаясь понять это. Установка LoadTimeWeaver, наконец, была ответом. Не знаю, как вы, наконец, поняли это, но спасибо! - person Sean Carroll; 24.07.2014
comment
Спасибо большое за этот пост. Это именно то, что мне нужно. - person Jazzepi; 19.11.2014
comment
Похоже, SPR-10856 исправлен в Spring 4.3. - person Jay; 03.06.2016
comment
Где установить свойство hibernate.ejb.use_class_enhancer в среде весенней загрузки с встроенным JPA данных Spring? - person Michał Stochmal; 29.01.2019

У меня аналогичная проблема. Я выполнил шаги, которые вы упомянули, чтобы успешно настроить Weaver. Я создал объект времени выполнения, используя byte buddy с аннотациями. И загрузка этого класса во время выполнения. Создал экземпляр того же, используя отражение и пытаясь сохранить. Но спящий режим жалуется, как

java.lang.IllegalArgumentException: Unknown entity:

Я считаю, что объект времени выполнения, который я создал, не улучшен, и спящий режим жалуется на то же самое.

person SDPS    schedule 20.01.2017