免责声明#1:我对XSD,数据库和JPA相当陌生 - 所以我的问题可能是荒谬的。
我有一个通过XSD指定的接口 - 我将接收XML文档,需要将其内容保存到关系数据库。我修改XSD的能力有限。界面本身由大量具有复杂关系的实体组成;在许多地方,不希望在XML文档中要求完整的对象图。
基本上,我的XSD目前看起来像这样:
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:hj="http://hyperjaxb3.jvnet.org/ejb/schemas/customizations"
xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
xmlns:ns1="urn:foo"
targetNamespace="urn:foo" elementFormDefault="qualified" jxb:version="2.0"
jxb:extensionBindingPrefixes="hj orm">
<xsd:complexType name="Foo">
<xsd:sequence>
<xsd:element name="fooId" type="xsd:string" nillable="false">
<xsd:annotation>
<xsd:appinfo>
<hj:id />
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Bar">
<xsd:sequence>
<xsd:element name="BarId" type="xsd:string" nillable="false">
<xsd:annotation>
<xsd:appinfo>
<hj:id />
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="associatedFoo" type="xsd:string" nillable="false">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Baz">
<xsd:sequence>
<xsd:element name="BazId" type="xsd:string" nillable="false">
<xsd:annotation>
<xsd:appinfo>
<hj:id />
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="associatedFoos" type="xsd:string" nillable="false" minOccurs="0" maxOccurs="unbounded">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
我通过hyperjaxb3(0.5.6)运行XSD并为Foo,Bar和Baz获取一组Java类。我想要的是生成的数据库模式要求Bar.associatedFoo和Baz.associatedFoos都是实际的fooId。但是,我不能只更新架构,以便例如bar.associatedFoo的类型为ns1:Foo。所以,问题是:我该怎么做?
这里的推理是XSD中的每个类型实际上都是大型,复杂,相互关联的对象图;我不希望Baz的XML文档必须包含每个Foo的完整XML表示。
(显然,一个选项是在创建JPA模式后手动手动添加数据库约束 - 但如果可能的话,我宁愿将此信息嵌入XSD中。)
在更简单的情况下(Bar.associatedFoo),我可以使用orm:column批注直接修改列定义:
<hj:basic>
<orm:column column-definition="VARCHAR(255) REFERENCES myschema.Foo"/>
</hj:basic>
但是(a)我不确定如何将此尝试扩展到Baz.associatedFoos案例,并且(b)如果可能的话,我更喜欢不那么脆弱的东西(列定义字符串需要在foo id的任何时候调整长度更改,模式名称更改或Foo的表名更改;它取决于JPA在CREATE TABLE foo之前决定CREATE TABLE Bar;并且在运行时之前不会产生错误。
如果重要 - 我使用openJPA 2.1.1作为我的JPA实现,Postgres 9.1作为我的DB。在XSD中,我可以根据需要更改ID定义(使其成为complexType,xsd:string的命名别名,或者可能是其他一些更改),并添加我喜欢的任何xsd:annotations,但我不能做很多我的类型的其他结构变化。
提前致谢!