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