2015-11-07 22 views
1

我有以下星座: B1.xsd和B2.xsd都导入A.xsd。使用maven-hyperjaxb3-plugin我使用JPA批注为B1.xsd和B2.xsd创建了Java类。所以A.xsd的类是在B1.xsd的项目中创建的,以及在B2.xsd的项目中创建的。 为了在一个持久性单元中使用这两组类,我通过jaxb外部绑定来设置每个实体上的数据库模式,如Editing @java.persitence.Table in external jaxb-Binding中所示。通过外部jaxb-Binding编辑@ java.persitence.Entity的名称参数

的问题,部署到wildfly后,wildfly抛出org.hibernate.DuplicateMappingException:重复导入:B1_ClassName指的是B1_ClassName和B2_ClassName(尝试使用自动导入= \ “假\”)“}}

所以我需要做的是通过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.xsdB2.xsd,就可能出现这种情况。

正确的解决方案不是编译A.xsd两次。我希望你没有变色龙模式(这是JAXB非常糟糕的设计模式)。在这种情况下,您可以将A.xsdB1.xsdB2.xsd编译在一起,也可以分别编译所有这些文件。您可以先编译A.xsd,然后将它用作B1和B2中的插曲。关于它的工作方式,请参见Using Episodes

在任何情况下,您都不应该为A.xsd类生成不同的包。

为了回答您的具体问题 - 尝试用自定义的复杂类型:

<hj:entity name="MyUniqueName"/> 

我想这应该覆盖自动生成的名称。然而这不是要走的路。

ps。这是一个测试项目集:

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