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

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

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

  • дм Сервер 1.0.2.SR02
  • AspectJ Runtime 1.6.3
  • AspectJ Weaver 1.6.3
  • Spring Framework 2.5.6.A
  • Eclipse Persistence 1.1.0
  • Javax Persistence API 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 -> [DatabaseTable (JOBS)])


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

Вопросы

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

Я предполагаю, что я начал ткачество во время загрузки с

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

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

Ответы [ 3 ]

2 голосов
/ 23 декабря 2009

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

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

1 голос
/ 02 марта 2010

Лучше использовать 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).

0 голосов
/ 28 апреля 2010

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

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

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

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

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

public class Contact {

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

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

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

...