Я немного озадачен странным поведением связанных объектов моего JPA.
У меня три комплекта:
Пакет пользователя содержит некоторые пользовательские объекты, но в основном это объект User
.
Энергетический комплект содержит некоторые связанные с энергией объекты, в частности ConsumptionTerminal
, который содержит Список пользователей.
Пакет Index содержит объект Index, который вообще не зависит.
Моя среда OSGi выглядит следующим образом:
Пакет DataSource, обеспечивающий 2 услуги : dataSource и jpaVendorAdapter.
Три связки. Они потребляют dataSource
и jpaVendorAdapter
.
Их module-context.xml
файл выглядит так:
И все они имеют persistence.xml
файл:
Пользователь
<?xml version="1.0" encoding="UTF-8"?>
<persistence>
<persistence-unit name="securityPU" transaction-type="JTA">
<jta-data-source>java:/securityDataSourceService</jta-data-source>
<class>net.nextep.amundsen.security.domain.User</class>
<!-- [...] -->
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="eclipselink.logging.level" value="INFO" />
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode" value="database" />
<property name="eclipselink.orm.throw.exceptions" value="true" />
</properties>
</persistence-unit>
</persistence>
Energy
<?xml version="1.0" encoding="UTF-8"?>
<persistence>
<persistence-unit name="energyPU" transaction-type="JTA">
<jta-data-source>java:/securityDataSourceService</jta-data-source>
<class>net.nextep.amundsen.security.domain.User</class>
<class>net.nextep.amundsen.energy.domain.User</class>
<!-- [...] -->
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="eclipselink.logging.level" value="INFO" />
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode" value="database" />
<property name="eclipselink.orm.throw.exceptions" value="true" />
</properties>
</persistence-unit>
</persistence>
Индекс: этот файл имеет самый простой файл persistence.xml, содержащий только класс Index (без общего класса).
Я использую именованную аннотацию @PersistenceUnit
, например @PersitenceUnit(name = 'securityPU')
(для пользовательского пакета).
И, наконец, я использую EclipseLink в качестве провайдера Jpa и Spring DM (+ Spring DM Server в процессе разработки)
Проблема заключается в следующем:
- Когда пакет User развернут, я могу сохранить объекты User.
- Когда развернуты и пользовательский, и энергетический пакеты, я не могу сохранить объекты пользователя (ни объект энергии). Но у меня нет никаких исключений !
- С пакетом Index нет никаких проблем.
Ошибка не зависит от источника данных (до сих пор я пытался использовать PostgreSQL и MySQL).
Мой первый вывод состоял в том, что <class>net.nextep.amundsen.security.domain.User</class>
в обоих единицах персистентности вызывало проблему. Я попытался без него (и скрыл зависимый от пользователя объект в комплекте энергии), но он тоже не удался.
Я немного озадачен этой ошибкой. Я также не совсем уверен в управлении транзакциями в этом контексте.
Я не был тем, кто спроектировал эту архитектуру (но я говорю моему стажеру ОК, не проверяя ее .. позор мне), но если бы я мог понять эту ошибку и, возможно, исправить ее без переписывания пакета (и прервать мою стажировку), я был бы признателен. Я делаю что-то неправильно ? (очевидно, но что ..) Я что-то упустил, читая документацию?
Кстати, я также ищу некоторые лучшие практики или советы, когда дело доходит до JPA, EclipseLink (или любого другого провайдера JPA) и Spring DM (и OSGi в целом). Я нашел интересные слайды от Майка Кейта на эту тему (просматривая Stackoverflow).