通过外部jaxb-Binding编辑@java.persitence.Entity的name参数
Editing the name parameter of @java.persitence.Entity through external jaxb-Binding
我有以下星座:
B1.xsd 和 B2.xsd 都导入 A.xsd。使用 maven-hyperjaxb3-plugin 我为 B1.xsd 和 B2.xsd 创建了带有 JPA 注释的 Java 类。所以A.xsd的类是在B1.xsd的项目中创建的,也是在B2.xsd的项目中创建的。
为了在一个持久性单元中使用这两组 类,我通过 jaxb 外部绑定在每个实体上设置数据库模式,如 .
所示
问题是,部署到wildfly后,wildfly抛出org.hibernate.DuplicateMappingException: duplicate import: B1_ClassName refers to both B1_ClassName and B2_ClassName (尝试使用 auto-import=\"false\")"}}
所以我需要做的是通过jaxb外部绑定编辑Entity注解的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
{
...
}
我的实际 绑定-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的名称参数吗?
免责声明:我是Hyperjaxb的作者。
答案是您不需要对此进行自定义。 IE。如果您需要自定义它,那是错误的。
您面临的问题是因为您为 A.xsd
模式生成了两组 类,可能在不同的包中。如果您有变色龙模式(A.xsd
没有目标命名空间)或者您只是编译它两次,因为您有 B1.xsd
和 B2.xsd
.[=24=,则可能是这种情况]
正确的解决方法是不编译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
我有以下星座:
B1.xsd 和 B2.xsd 都导入 A.xsd。使用 maven-hyperjaxb3-plugin 我为 B1.xsd 和 B2.xsd 创建了带有 JPA 注释的 Java 类。所以A.xsd的类是在B1.xsd的项目中创建的,也是在B2.xsd的项目中创建的。
为了在一个持久性单元中使用这两组 类,我通过 jaxb 外部绑定在每个实体上设置数据库模式,如
问题是,部署到wildfly后,wildfly抛出org.hibernate.DuplicateMappingException: duplicate import: B1_ClassName refers to both B1_ClassName and B2_ClassName (尝试使用 auto-import=\"false\")"}}
所以我需要做的是通过jaxb外部绑定编辑Entity注解的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
{
...
}
我的实际 绑定-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的名称参数吗?
免责声明:我是Hyperjaxb的作者。
答案是您不需要对此进行自定义。 IE。如果您需要自定义它,那是错误的。
您面临的问题是因为您为 A.xsd
模式生成了两组 类,可能在不同的包中。如果您有变色龙模式(A.xsd
没有目标命名空间)或者您只是编译它两次,因为您有 B1.xsd
和 B2.xsd
.[=24=,则可能是这种情况]
正确的解决方法是不编译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