我的 xsd,如附加文件中所示,报告关系 ROOT 1-->1 标头,但是当我使用 hyperjaxb3 构建项目时,它创建了一个错误的 @ManyToOne 注释,而不是 @OneToOne,因为 xsd 有默认序列约束(1): 创建的代码是:
@ManyToOne(targetEntity = HeaderType.class, cascade = {
CascadeType.ALL
})
@joincolumn(name = "HEADER_ROOT_HJID")
public HeaderType getHeader() {
摘自 XSD:
HiSrc HyperJAXB Maven Plugin 会生成
@ManyToOne
JPA 注释。这是预期的行为。在没有其他信息的情况下,这种选择提供了外国参考,但不推断所有权。当所有权is存在时,目标实体的生命周期就绑定到源,这是一个更强的选择。
当然,您的设计可以在适当的时候选择将所有权应用于这种类型的关系。要生成
@OneToOne
关系,您可以定义此 JAXB 绑定:
...
<jaxb:bindings node="xs:element[@name='Root']//xs:element[@name='header']">
<hj:one-to-one>
<!-- Optional, custom column name.
<orm:join-column name="HEADER_ROOT_HJID"/>
-->
</hj:one-to-one>
</jaxb:bindings>
...
使用来自 HyperJAXB 命名空间的自定义将上述绑定应用于目标
header
元素。或者,您可以使用 orm
命名空间来自定义 JPA 用于将源实体 Root
连接到目标实体 Header
的数据库列;否则,HyperJAXB 将选择适当的列名称来表示连接。
JAXB 绑定文件 RootHeader.xjb 应用于 XML 模式文件 RootHeader.xsd 以生成 JAXB/JPA 实体。这些类生成为
target/generated-sources/xjc/org/example/root_header/
并包含在类路径中。
下载此 demo (zip) 并将其解压到本地文件夹后,您可以使用两个 JPA 提供程序之一运行测试和/或应用程序:
注意: 该演示是一个独立的 Maven 项目。
mvn -Peclipselink clean test
mvn -Peclipselink clean compile exec:java
或
mvn -Phibernate clean test
mvn -Phibernate clean compile exec:java
此输出显示使用Hibernate的测试结果。
默认情况下,该项目使用本地 H2 数据库。当应用程序创建其
EntityManagerFactory
时,H2 数据库会自动创建。
或者,可以重新配置该项目以使用您自己的 PostgreSQL 数据库服务器。
hisrc-hyperjaxb-maven-plugin 配置为使用提供的 RootHeader.xsd 模式生成 JPA/JAXB 类。该模式提供了命名空间
"http://org.example/root_header"
,JAXB 使用它来使用自己的命名约定创建 Java package
名称。
作为默认选项,使用这些
XJChisrc-basicjaxb-plugins 生成 Java 内置
Object
方法的更高级实现。特别是,示例项目使用 toString
插件来显示未编组的 Root
对象的人类可读表示。
注意: hisrc-hyperjaxb-maven-plugin 扩展了 hisrc-higherjaxb-maven-plugin 但预配置 几个 XJC hisrc-basicjaxb-plugins;因此,运行时类路径需要 hisrc-basicjaxb-runtime 依赖项。有关配置详细信息的更多帮助,请参阅...
mvn hisrc-hyperjaxb:help -Ddetail=true
JUnit 测试类 RoundtripTest.java 扫描示例文件并调用方法
super.checkSample(File samle)
将每个文件提供给测试人员。对于此项目,创建了 EntityManagerFactory
和 JAXBContext
,并且 samples 路径中的每个文件为:
Root
对象Root
对象EntityManager
,em,实例
Root
对象是否相等成功后,每个对象都会被编组以用于日志记录和您的审查。
具有
main(...)
方法的 Java 标准引擎应用程序位于 [org.example.root_header.Main
][11]。该应用程序使用以下命令执行:
mvn -Peclipselink clean compile exec:java -Dexec.args="src/test/samples/root-header-01.xml"
OR
mvn -Phibernate clean compile exec:java -Dexec.args="src/test/samples/root-header-01.xml"
免责声明:我是HiSrc项目的维护者。