Hyperjaxb/JPA:根据实体的id而不是值引用实体

Hyperjaxb/JPA:根据实体的id而不是值引用实体,jpa,orm,openjpa,hyperjaxb,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

免责声明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类。我希望生成的DB模式要求Bar.associatedFoo和Baz.associatedFoo都是实际的Fooid。但是,我不能只更新模式,使例如bar.associatedFoo的类型为ns1:Foo。所以,问题是:我该怎么做

这里的理由是XSD中的每种类型实际上都是大型、复杂、相互关联的对象图;我不希望Baz的XML文档必须包含其每个foo的完整XML表示

显然,一种选择是在JPA模式创建之后手动添加DB约束,但如果可能的话,我宁愿将此信息嵌入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在创建TABLE foo之前决定创建TABLE Bar;并且直到运行时才产生错误

如果有关系的话,我将使用OpenJPA2.1.1作为我的JPA实现,使用Postgres9.1作为我的DB。在XSD中,我可以根据需要更改ID定义,使其成为complexType、XSD:string的命名别名,或者可能进行一些其他更改,并添加我喜欢的任何XSD:annotation,但我不能对我的类型进行许多其他结构更改

提前谢谢