Я делаю приложение osgi, работающее на karaf 4.0.4.OSGI - Разделить объекты в нескольких пакетах
Мое приложение использует одну базу данных PostgreSQL. Разъем обрабатывается pax-jdbc. Я использую Karaf JPA 2.3.0
особенность и Hibernate 4.3.6.Final
особенность.
Некоторые модули предлагают услуги, которые могут быть добавлены/удалены.
TL/DR: Есть ли способ разделить мои объекты в нескольких пакетах?
Вот моя ситуация:
Я в настоящее время модуль с именем model
, которые держат
- моего
persistence.xml
файла - классов аннотированных
@Entity
- классов аннотированных
@Entity
и@Inheritance(strategy = InheritanceType.JOINED)
- услуги чтобы получить доступ к моим услугам.
Вот моя настойчивость файл:
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="maindb" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=maindb)</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<!-- <property name="hibernate.hbm2ddl.auto" value="create-drop"/> -->
</properties>
</persistence-unit>
</persistence>
И абстрактные службы, подклассы для доступа к этим организациям:
public abstract class AbstractDaoService<T> implements IDaoService<T> {
@PersistenceContext(unitName = "maindb")
protected EntityManager entitymanager;
protected Class<T> clazz;
public AbstractDaoService(Class<T> clazz) {
this.clazz = clazz;
}
@Override
public T find(Object id) {
return entitymanager.find(clazz, id);
}
// rest of class is omitted
}
Теперь у меня есть 3 других пучков. назовем их A, B и C. Используем объекты от model
через сервисы, внедряемые в план. Это прекрасно работает.
Но проблема в том, что A также использует услуги, предоставляемые B и C. И в каждом из этих двух пакетов есть класс, аннотированный @Entity
, и класс, расширяющий их, с аннотацией @Inheritance
.
- Сначала я просто попытался в основном добавить эти пучки и запустить его. СущностьManager можно найти в
B
иC
. - Следующая attemp является добавление
persistence.xml
файла в каждом из моих пучков, но он не работает, как в схемеA
рассматривается как разные, и это не будет загружать простирающийся класс отB
иC
- Тогда я попытался split
B
пополам: один (B-Main) с услугами, которые я хотел реализовать, а другой (B-frag) как фрагмент пакета, размещенныйmodel
. То же самое для пакетаC
. Установкаmodel
,A
и толькоB-Main
иB-frag
(илиC-Main
иC-frag
) работает нормально. Но если я пытаюсь установитьB-Main
,B-frag
,C-Main
иC-frag
, я получаю следующее сообщение об ошибке:
.
javax.persistence.PersistenceException: [PersistenceUnit: maindb] Unable to build Hibernate SessionFactory
...
Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mapping <my class annotated with @Inheritance`>
Я думаю, что это происходит потому, что, когда второй фрагмент будет решен, то перезагружать фрагмент узла и попытаться перераспределить объекты на уже существующие EntityManager (не уверен).
Слишком плохо, что его нельзя продлить, на мой взгляд, это большая потеря для модульности. Что делать, если у меня есть другие сущности, не связанные с теми, что были в моем наборе персистентности? Могу ли я иметь несколько наборов персистентности с несвязанными объектами с похожим файлом 'persitence.xml'? – jhamon
У вас может быть несколько единиц персистентности, но они будут не разрешены в базе данных. Я думаю, что расширение не будет работать на практике, так как пучки приходят и уходят, но база данных всегда будет одинаковой. –