JAXB 如何将复合键字段映射为同级

JAXB how to map composite key fields as siblings

我在我的数据库模型之后定义了以下实体:

@Entity
@Table(name = "PERSON")
@XmlRootElement(name = "person")
public class Person implements java.io.Serializable {
    @Id
    private Long personId;
    private String personName;

    @XmlElementWrapper(name="children")
    @XmlElement(name="child")
    private Set<Child> children = new HashSet<Child>(0);

    // getters & setters
}

@Entity
@Table(name = "CHILD")
@XmlRootElement(name = "child")
public class Child implements java.io.Serializable {
    @EmbeddedId
    private ChildId id;
    private Date childName;

    // getters & setters
}

@Embeddable
public class ChildId implements java.io.Serializable {
    @XmlTransient
    private Person parentId;
    private Date childBirthDate;
    private int childOrder;

    // getters & setters
}

在目前的情况下,当使用 JAXB 编组时,我得到的是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
    <personId>7</personId>
    <personName>Foo</personName>
    <children>
        <child>
            <childName>Bar</childName>
            <id>
                <childBirthDate>2001-06-22</childBirthDate>
                <childOrder>1</childOrder>
            </id>
        </child>
    </children>
</person>

我想得到的是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
    <personId>7</personId>
    <personName>Foo</personName>
    <children>
        <child>
            <childName>Bar</childName>
            <childBirthDate>2001-06-22</childBirthDate>
            <childOrder>1</childOrder>
        </child>
    </children>
</person>

有没有办法让 ChildId 的字段与其他 Child 的字段处于同一级别?

请告知我的选择。

移动评论回答:

由于在同一个 class 中可以有多个 @Id,您只需将字段从 ChildId class 移动到 Child class。然后用 @Id 注释每个字段(从 ChildId 移动的字段)。这样一来,所有字段都处于同一级别,因为它们在同一 class 中,同时还保留了 @EmbeddedId

的功能