Hyperjaxb / JPA:通过id而不是value引用实体

时间:2012-10-16 14:31:27

标签: jpa orm openjpa hyperjaxb

免责声明#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在C​​REATE TABLE foo之前决定CREATE TABLE Bar;并且在运行时之前不会产生错误。

如果重要 - 我使用openJPA 2.1.1作为我的JPA实现,Postgres 9.1作为我的DB。在XSD中,我可以根据需要更改ID定义(使其成为complexType,xsd:string的命名别名,或者可能是其他一些更改),并添加我喜欢的任何xsd:annotations,但我不能做很多我的类型的其他结构变化。

提前致谢!

0 个答案:

没有答案