使用JAXB将xml映射到jpa实体

时间:2011-12-06 04:44:37

标签: jpa jaxb eclipselink moxy

是否可以使用JAXB将xml映射到jpa实体? Eclipselink Moxy会有帮助吗?

1 个答案:

答案 0 :(得分:4)

注意:我是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;

}

了解更多信息

<强> 2。映射复合关键关系

我们通常会考虑将对象树映射到XML,但是JAXB支持使用@XmlID/@XmlIDREF的组合来映射表示图形的节点之间的关系。标准机制是一个键,一个外键。 JPA支持复合键的概念,MOXy使用@XmlKey@XmlJoinNodes(类似于JPA中的@XmlJoinColumns)也是如此。

<强>员工

@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实现都支持这个概念。