2

我有一个如下所示的 xml 文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Envelope>
    <AttrA>aaa</AttrA>
    <AttrB>bbb</AttrB>
    <Element ID="1">elem1</Element>
    <Element ID="2">elem2</Element>
    ...
    <Element ID="n">elemn</Element>
</Envelope>

以及对应的 Java 类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"attrA",
"attrB",
"elements",
})
@XmlRootElement(name = "Envelope")
public class Envelope implements Serializable, Equals, HashCode, ToString {  
    @XmlElement(name = "AttrA", required = true)
    protected AttrA attrA;
    @XmlElement(name = "AttrB", required = true)
    protected AttrB attrB;
    @XmlElement(name = "Element")
    protected List<Element> elements;

    @OneToMany(targetEntity = Element.class, cascade = {CascadeType.ALL})
    @JoinColumn(name = "ELEMENT_ID")
    public List<Element> getElements() {
        if (elements == null) {
            elements = new ArrayList<Element>();
        }
        return this.elements;
    }
}

解组工作正常,我的元素列表也填充了适当的元素,但有时元素在列表中被交换。Eq 有时我会得到一个元素 1 和 2 交换或元素 2 和 3 交换位置的列表。这会影响稍后在对象处理期间的 equals 方法。我无法弄清楚究竟是什么影响了元素在列表中的插入顺序。

是否有任何注释或其他方式来定义元素的插入顺序?有人看到我的代码有任何其他问题吗?

问候,伊琳娜。

更新: 我的架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
           xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           elementFormDefault="qualified" attributeFormDefault="unqualified" jxb:version="1.0">
<xs:element name="Envelope">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="mynamespace:AttrA"/>
            <xs:element ref="mynamespace:AttrB"/>
            <xs:sequence>
                <xs:element ref="mynamespace:Element" minOccurs="0" maxOccurs="99"/>
            </xs:sequence>
        </xs:sequence>
    </xs:complexType>
</xs:element>
...
<xs:element name="Element">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="ElemAttrA" type="ElemAttrA" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="ID" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:positiveInteger">
                    <xs:minInclusive value="1"/>
                    <xs:maxInclusive value="99"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
</xs:element>
</xs:schema>  

我的绑定-xjc.xjb:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns="http://java.sun.com/xml/ns/jaxb"
               xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
               xmlns:hj="http://hyperjaxb3.jvnet.org/ejb/schemas/customizations"
               xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
               xmlns:persistence="http://java.sun.com/xml/ns/persistence"
               xmlns:annox="http://annox.dev.java.net" 
               jaxb:extensionBindingPrefixes="hj orm annox persistence">

<jaxb:bindings schemaLocation="envelope.xsd" node="/xs:schema">

    <jaxb:bindings node="//xs:element[@name='Envelope']/xs:complexType/xs:sequence/xs:sequence/xs:element[@ref='mynamespace:Element']">
        <hj:one-to-many>
            <orm:order-by name="ID" />
        </hj:one-to-many>
    </jaxb:bindings>
    ...
</jaxb:bindings>
...
</jaxb:bindings>
4

1 回答 1

2

这不是一个答案,只是一些对评论来说太大的提示。

了解 JAXB RI 代码我认为没有机会获得列表中项目的不确定顺序。那里发生的事情非常简单,最后来 - 最后添加。

标记了问题,并且您的类实现了 JAXB2 Basics 运行时的接口,这表明您可能正在使用 Hyperjaxb。

如果是这种情况,那么布莱斯就可能发生的事情提供了一个非常好的理论。您List可能会在没有排序列的情况下映射到数据库,因此可能无法保证顺序。检查你是否有@OrderColumn生成的东西。我认为这不是默认生成的。

无论如何,发布您的课程的完整代码和随附的测试用例会有所帮助。对于 Hyperjaxb,使用 GitHub 发布问题:

更新

正如 Blaise 预测的那样,问题确实出在 missing@OrderColumn上(好球!)。

简而言之,您可以使用以下自定义添加此列:

<hj:one-to-many>
    <orm:order-column/>
</hj:one-to-many>

请参阅定制指南相关部分

您还可以全局自定义它

<jaxb:bindings schemaLocation="schema.xsd" node="/xs:schema">
    <hj:persistence>
        <hj:default-one-to-many>
            <orm:join-column/>
        </hj:default-one-to-many>
    </hj:persistence>
</jaxb:bindings>

现在所有生成的@OneToMany都会有一个@JoinColumn.

更新 2

定制@OrderBy(如您自己所想):

<hj:one-to-many>
    <orm:order-by>ID</orm:order-by>
</hj:one-to-many>

还有几个参考:

免责声明:我是Hyperjaxb的作者。

于 2014-11-10T21:10:37.450 回答