Проблема с переплетением времени загрузки Aspectj при использовании EclipseLink JPA в Spring dm Server 1.x

Я пытаюсь заставить EclipseLink JPA работать в среде Spring dm Server OSGi.

Соответствующие платформы и библиотеки, загруженные из репозитория Spring Enterprise Bundle Repository, включают:

  • дм Сервер 1.0.2.SR02
  • Среда выполнения AspectJ 1.6.3
  • Аспект J Уивер 1.6.3
  • Spring Framework 2.5.6.A
  • Затмение Стойкость 1.1.0
  • API сохраняемости Javax 1.99.0

Я следовал той же структуре, которая представлена ​​в примере PetClinic-1.5.0 для настройки EclipseLink JPA. Все работает до тех пор, пока не будет включена ленивая выборка (для которой требуются прокси-объекты).

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

---- (обрезано для удобства чтения)

Исключение [EclipseLink-60] (Eclipse Persistence Services — 1.1.0.r3634): org.eclipse.persistence.exceptions.DescriptorException Описание исключения: Метод [_persistence_setcustomer_vh] или [_persistence_getcustomer_vh] не определен в объекте [net.fractech .fds.backoffice.Job]. Внутреннее исключение: java.lang.NoSuchMethodException: net.fractech.fds.backoffice.Job._persistence_getcu stomer_vh() Сопоставление: org.eclipse.persistence.mappings.OneToOneMapping[customer] Дескриптор: RelationalDescriptor(net.fractech.fds.backoffice.J ob --> [Таблица базы данных (JOBS)])


Это показывает, что методы _persistence_getcustomer_vh() и _persistence_setcustomer_vh() не были автоматически встроены в объект домена задания.

Вопросы

1.) Как мне определить, действительно ли работает переплетение времени загрузки; кроме того, как мне записать, какое время загрузки было запущено ткацким агентом и ткачеством? Как передать переключатели этому ткачу, чтобы он выводил отладочную информацию?

Я предполагаю, что я начал плетение во время загрузки с ‹context:load-time-weaver аспектj-weaving="on" /›

2.) Многие поиски показали, что мне не нужно передавать параметр -javaagent в jvm при использовании dm Server. Это правильно?

3.) Я заверил, что мои объекты домена в другом пакете имеют доступ к классам сохраняемости eclipse, утверждая com.springsource.org.eclipse.persistence;version="[1.1.0,1.1.0]";import-scope: =application в моем пакете eclipselink, включая все пакеты приложений в PAR. Требуются ли какие-либо другие конфигурации для включения EclipseLink JPA в Spring dm Server?


person Marshall Cody McCain    schedule 27.10.2009    source источник


Ответы (3)


У меня были похожие проблемы. Сначала попробуйте установить eclipselink.weaving.lazy=false или eclipselink.weaving=false, если это не сработает. Пришлось ставить последнее.

Если вы хотите сослаться на настройку, которую я использую, чтобы узнать, применима ли она к вам, у меня есть сообщение об этом на моем сайте.

person Christopher G. Stach II    schedule 23.12.2009

Лучше использовать Equinox Waving Springwaver.

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

...

<property name="loadTimeWeaver">

<bean class="org.eclipse.equinox.weaving.springweaver.EquinoxAspectsLoadTimeWeaver"/>

</property>

</bean>

Тогда вам не нужно использовать опцию -javaagent.

Вы можете найти рабочие примеры с JPA и EclipseLink здесь http://code.google.com/p/springdm-in-action/ (см. главу 7).

person Łukasz Koniecki    schedule 02.03.2010

Я пытался использовать EquinoxAspectsLoadTimeWeaver в контексте JPa (с EclipseLink), но он не преобразует классы моделей, если ваше объявление bean-компонента EquinoxAspectsLoadTimeWeaver не выполняется в том же пакете, что и пакет Model.

Класс преобразования EquinoxAspectsLoadTimeWeaver ТОЛЬКО для классов, хранящихся в пакете, который объявляет EquinoxAspectsLoadTimeWeaver.

Я попробовал пример http://code.google.com/p/springdm-in-action/ (см. главу 7) (спасибо за этот пример Лукашу). Объявление EquinoxAspectsLoadTimeWeaver позволяет избежать ошибки

Caused by: java.lang.IllegalStateException: Cannot apply class transformer without LoadTimeWeaver specified

Но классы Model не трансформируются (ткаются). Вплетение в EclipseLink управляет, например, ленивым режимом. Например, если вы установите в образце модели контактный ленивый режим следующим образом:

public class Contact {

...
    @Column(name="last_name")
    @Basic(fetch=FetchType.LAZY)
    private String lastName;

вы заметите, что ленивая загрузка не применяется, потому что класс Model Contact не работает.

С уважением Анджело

person Angelo    schedule 28.04.2010