是否可以使用 JAXB 将 xml 映射到 jpa 实体?Eclipselink Moxy 会有帮助吗?
1 回答
注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB 2 (JSR-222)专家组的成员。
是的,您可以将 JPA 实体映射到 XML,以下是EclipseLink JAXB (MOXy)使这更容易的一些方法。
1. 双向映射
顾客
import javax.persistence.*;
@Entity
public class Customer {
@Id
private long id;
@OneToOne(mappedBy="customer", cascade={CascadeType.ALL})
private Address address;
}
地址
import javax.persistence.*;
import org.eclipse.persistence.oxm.annotations.*;
@Entity
public class Address implements Serializable {
@Id
private long id;
@OneToOne
@JoinColumn(name="ID")
@MapsId
@XmlInverseReference(mappedBy="address")
private Customer customer;
}
了解更多信息
- http://blog.bdoughan.com/2010/07/jpa-entities-to-xml-bidirectional.html
- http://bdoughan.blogspot.com/2010/08/creating-restful-web-service-part-25.html
2. 映射复合键关系
我们通常认为将对象树映射到 XML,但是 JAXB 支持使用@XmlID
/@XmlIDREF
的组合来映射表示图形的节点之间的关系。标准机制是一个键,一个外键。JPA 支持组合键的概念,MOXy 也使用@XmlKey
and @XmlJoinNodes
(类似于@XmlJoinColumns
JPA 中的)。
员工
@Entity
@IdClass(EmployeeId.class)
public class Employee {
@Id
@Column(name="E_ID")
@XmlID
private BigDecimal eId;
@Id
@XmlKey
private String country;
@OneToMany(mappedBy="contact")
@XmlInverseReference(mappedBy="contact")
private List<PhoneNumber> contactNumber;
}
电话号码
@Entity
public class PhoneNumber {
@ManyToOne
@JoinColumns({
@JoinColumn(name="E_ID", referencedColumnName = "E_ID"),
@JoinColumn(name="E_COUNTRY", referencedColumnName = "COUNTRY")
})
@XmlJoinNodes( {
@XmlJoinNode(xmlPath="contact/id/text()", referencedXmlPath="id/text()"),
@XmlJoinNode(xmlPath="contact/country/text()", referencedXmlPath="country/text()")
})
private Employee contact;
}
了解更多信息
3. MOXy 允许复合和嵌入式密钥
JPA 还可以使用嵌入的键类来表示复合键。MOXy 也支持这种类型的复合键。
了解更多信息
4. EclipseLink JAXB (MOXy) 和 EclipseLink JPA 有共同的概念
EclipseLink 提供了共享一个共同核心的 JAXB 和 JPA 实现。这意味着它们共享许多相同的概念,例如:
虚拟访问方法
EclipseLink 支持虚拟属性的概念。在创建需要按租户自定义的多租户应用程序时,这很有用。EclipseLink 的 JPA 和 JAXB 实现都支持这个概念。