我有以下星座: B1.xsd和B2.xsd都导入A.xsd。使用 maven-hyperjaxb3-plugin 我为B1.xsd和B2.xsd创建了带有JPA注释的Java类。所以A.xsd的类是在B1.xsd的项目中创建的,也是在B2.xsd的项目中创建的。 为了在一个持久性单元中使用这两组类,我通过jaxb外部绑定每个实体上的数据库模式,如Editing @java.persitence.Table in external jaxb-Binding中所示。
问题是,在部署到wildfly之后,wildfly抛出 org.hibernate.DuplicateMappingException:重复导入:B1_ClassName同时指B1_ClassName和B2_ClassName(尝试使用auto-import = \" false \&#34 ;)"}}
所以我需要做的是通过jaxb外部绑定编辑实体注释的name参数,以便
@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
{
...
}
我的实际 bindings-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 :(得分: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"/>
我认为这应该覆盖自动生成的名称。然而,这不是可行的方法。
PS。这是剧集的测试项目:
https://github.com/highsource/hyperjaxb3/tree/master/ejb/tests/episodes