2015-11-07 3 views
1

У меня следующее созвездие: B1.xsd и B2.xsd оба импортируют A.xsd. Использование maven-hyperjaxb3-plugin Я создал классы Java с JPA-аннотациями для B1.xsd и B2.xsd. Таким образом, классы A.xsd создаются в проекте B1.xsd, а также es в проекте B2.xsd. Чтобы использовать эти два набора классов в одном модуле сохранения, я установил через jaxb внешнюю привязку схемы базы данных к каждой Entity, как показано в Editing @java.persitence.Table in external jaxb-Binding.Редактирование параметра имени @ java.persitence.Entity через внешний jaxb-Binding

Проблема, после развертывания в wildfly, wildfly бросает org.hibernate.DuplicateMappingException: дублированный импорт: B1_ClassName относится как к B1_ClassName и B2_ClassName (попробуйте использовать автоматический импорт = \ "ложный \") "}}

так что мне нужно сделать, это редактирование параметра имени в аннотации Entity через JAXB внешнее связывание, так что

@XmlRootElement(name = "B1_Element1") 
@Immutable 
@Cacheable(true) 
@Entity(name = "B1_Element1") 
@Table(name = "B1_Element1") 
public class B1_Element1 
    implements Serializable, Equals, HashCode, ToString 
{ 
... 
} 

будет выглядеть

@XmlRootElement(name = "B1_Element1") 
@Immutable 
@Cacheable(true) 
@Entity(name = "PACKAGE_NAME.B1_Element1") 
@Table(name = "B1_Element1") 
public class B1_Element1 
    implements Serializable, Equals, HashCode, ToString 
{ 
... 
} 

Мои фактические привязок-xjc.xjb выглядит следующим образом

<jaxb:globalBindings localScoping="toplevel"> 
    <xjc:serializable /> 
</jaxb:globalBindings> 

<jaxb:bindings schemaLocation="B1.xsd" 
    node="/xs:schema"> 

    <hj:persistence> 

     <hj:default-generated-id name="Hjid"> 
      <orm:generated-value strategy="IDENTITY" /> 
     </hj:default-generated-id> 

     <hj:default-entity> 
      <orm:table schema="B1_database_schema" /> 
     </hj:default-entity> 

    </hj:persistence> 

    <jaxb:schemaBindings> 
     <jaxb:package name="b1.package.name" /> 
    </jaxb:schemaBindings> 

</jaxb:bindings> 

Кто-нибудь имеет представление о том, как я могу изменить параметр Название @ java.persitence.Entity?

ответ

0

Отказ от ответственности: Я являюсь автором Hyperjaxb.

Ответ заключается в том, что вам не нужно настраивать его. То есть если вам нужно настроить это, что-то не так.

Проблема, с которой вы сталкиваетесь, заключается в том, что вы создаете два набора классов для вашей схемы A.xsd, возможно, в разных пакетах. Это может иметь место, если у вас либо есть схема хамелеона (A.xsd не имеет целевого пространства имен), либо если вы просто скомпилируете его дважды, потому что у вас есть B1.xsd и B2.xsd.

Правильное решение - не компилировать A.xsd дважды. Надеюсь, у вас нет схемы хамелеона (это очень плохой шаблон проектирования для JAXB). В этом случае вы можете либо скомпилировать A.xsd, B1.xsd и B2.xsd вместе, либо вы можете скомпилировать все отдельно. Вы можете скомпилировать A.xsd и использовать его как эпизод в B1 и B2. См. Using Episodes о том, как это работает.

В любом случае вы не должны производить разные пакеты для классов A.xsd.

Чтобы ответить на конкретный вопрос - попробуйте Настроив сложные типы с:

<hj:entity name="MyUniqueName"/> 

Я думаю, что это должен переопределить автоматически генерируемое имя. Однако это не путь.

пс.Вот тестовый проект для эпизодов:

https://github.com/highsource/hyperjaxb3/tree/master/ejb/tests/episodes

+0

Здравствуйте @lexicore, спасибо за Ваш ответ. Я знаю, что это не лучшее решение, но делать сумасшедшие вещи с помощью hyperjaxb более забавно, чем просто использовать стандартные решения :) Есть ли способ редактировать параметр имени (например, давая им префикс) всех сложных типов однажды? Это было бы полезно, потому что у меня их почти 100. – Erzen

+0

@Erzen Ну, если вы хотите хардкор, вот хардкор. Вы можете написать и настроить собственную стратегию именования. Вот [пример] (https://github.com/highsource/hyperjaxb3/tree/master/ejb/tests/custom-naming). Внедрите/замените метод 'Naming.getEntityName (...)'. – lexicore