一尘不染

JAXB将循环引用映射到XML

java

我有一个包含循环的对象图。我如何让JAXB处理呢?我尝试@XmlTransient在子类中使用批注,但JAXB编组器仍检测到周期。

@Entity
@XmlRootElement
public class Contact {

    @Id
    private Long contactId;

    @OneToMany(mappedBy = "contact")
    private List<ContactAddress> addresses;

...

}

@Entity
@XmlRootElement
public class ContactAddress {

    @Id
    private Long contactAddressId;

    @ManyToOne
    @JoinColumn(name = "contact_id")
    private Contact contact;

    private String address;

...

}

阅读 223

收藏
2020-09-08

共1个答案

一尘不染

使用JAXB的好处是它是具有多个实现的标准运行时(就像JPA一样)。

如果使用EclipseLink JAXB(MOXy),则可以使用许多扩展来处理JPA实体,包括双向关系。这是使用MOXy
@XmlInverseReference批注完成的。它的作用类似于元帅上的@XmlTransient,并在元帅上填充目标与源的关系。

http://wiki.eclipse.org/EclipseLink/Examples/MOXy/JPA/Relationships

@Entity 
@XmlRootElement 
public class Contact {

    @Id 
    private Long contactId;

    @OneToMany(mappedBy = "contact") 
    private List<ContactAddress> addresses;

...

}

@Entity 
@XmlRootElement 
public class ContactAddress {

    @Id 
    private Long contactAddressId;

    @ManyToOne 
    @JoinColumn(name = "contact_id") 
    @XmlInverseReference(mappedBy="addresses")
    private Contact contact;

    private String address;

...

}

其他扩展可用,包括对复合键和嵌入式键类的支持。

要指定EcliseLink MOXy JAXB实现,您需要在模型类(即Contract)中包含jaxb.properties文件,并具有以下条目:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
2020-09-08