Jor*_*lan 19 java jpa jaxb xml-serialization
我有一个包含循环的对象图.我如何让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;
...
}
Run Code Online (Sandbox Code Playgroud)
bdo*_*han 13
使用JAXB的好处在于它是一个具有多个实现的标准运行时(就像JPA一样).
如果您使用EclipseLink JAXB(MOXy),那么您可以使用许多扩展来处理JPA实体,包括双向关系.这是使用MOXy @XmlInverseReference批注完成的.它与marshal上的@XmlTransient类似,并在unmarshal上填充目标到源的关系.
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;
...
}
Run Code Online (Sandbox Code Playgroud)
其他扩展可用,包括支持复合键和嵌入式键类.
要指定EcliseLink MOXy JAXB实现,您需要在模型类(即Contract)中包含一个jaxb.properties文件,并带有以下条目:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Run Code Online (Sandbox Code Playgroud)
小智 6
XMLTransient几乎总是适用于循环.您可能在字段级别上具有XMLTransient,但尚未将XMLAccessorType指定为XmlAccessType.Field.如果您没有指定任何内容,则默认值为XmlAccessType.Property - 或者您的getter.我已经体验过Jaxb从类中获取xml元素,我错过了访问者类型注释,并且仍然可以正常工作.
归档时间: |
|
查看次数: |
19420 次 |
最近记录: |