7

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

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

ответ

25

После значительного чтения кода и отладки, я понял это. Жаль, что документация Hibernate ORM не включает эту информацию. (Чтобы быть справедливыми, Hibernate EntityManager documentation делает, но это не так легко найти. Hibernate instructions on "Using lazy property fetching" только говорит, «Ленивая загрузка свойства требует buildtime байткод приборов.» Это делает не упоминания, что вы можете использовать выполнения приборы со свойством Hibernate EntityManager.)

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

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

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

+0

Ударился головой о стену, пытаясь понять это. Установка LoadTimeWeaver наконец-то была ответом. Не уверен, как вы, наконец, поняли это, но спасибо! –

+1

Большое вам спасибо за этот пост. Это именно то, что мне нужно. – Jazzepi

+1

Похоже, SPR-10856 установлен весной 4.3 – Jay

0

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

java.lang.IllegalArgumentException: Unknown entity: 

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