2016-05-25 3 views
0

Я делаю приложение 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 (не уверен).

ответ

2

Спецификация OSGi 4.2 127.3.2 определяет пакет сохранения. Он содержит одну или несколько единиц сохранения. Все объекты, определенные в блоке персистентности, должны начинаться в банке пакета. Они могут быть не из фрагмента.

Я думаю, что теоретически можно поместить классы сущностей в другой пакет, но только если пакет персистентности импортирует эти пакеты. Таким образом, вы не можете использовать это, чтобы продлить классы позже в том смысле, что основной пакет персистентности не знает их.

+0

Слишком плохо, что его нельзя продлить, на мой взгляд, это большая потеря для модульности. Что делать, если у меня есть другие сущности, не связанные с теми, что были в моем наборе персистентности? Могу ли я иметь несколько наборов персистентности с несвязанными объектами с похожим файлом 'persitence.xml'? – jhamon

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^