Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "EclipseLink/UserGuide/MOXy/Mapping JPA Entities to XML"
m (New page: =Mapping JPA Entities to XML= This section demonstrates three strategies for mapping JPA entities to XML: * Binding JPA Relationships to XML * Bindin...) |
m |
||
Line 1: | Line 1: | ||
− | + | {{EclipseLink_UserGuide | |
+ | |info=y | ||
+ | |toc=y | ||
+ | |eclipselink=y | ||
+ | |eclipselinktype=MOXy | ||
+ | }} | ||
=Mapping JPA Entities to XML= | =Mapping JPA Entities to XML= | ||
This section demonstrates three strategies for mapping JPA entities to XML: | This section demonstrates three strategies for mapping JPA entities to XML: |
Revision as of 14:28, 11 April 2011
EclipseLink MOXy
EclipseLink | |
Website | |
Download | |
Community | |
Mailing List • Forums • IRC • mattermost | |
Issues | |
Open • Help Wanted • Bug Day | |
Contribute | |
Browse Source |
Contents
Mapping JPA Entities to XML
This section demonstrates three strategies for mapping JPA entities to XML:
- Binding JPA Relationships to XML
- Binding Compound Primary Keys to XML
- Binding Embedded ID Classes to XML
Binding JPA Relationships to XML
This example demonstrates how to use JAXB to generate an XML representation from a set of JPA entities.
JAXB will apply a "tree structure" to the graph of JPA entities. Multiple tree representations of a graph are possible and will depend on the root object chosen and the direction the relationships are traversed.
JPA Entities
For this example the following JPA entities will be used: __Note__: To save space, package names, import statements, and the get /set methods have been omitted. All annotations shown are standard JPA annotations.
@Entity public class Department { @Id @Column(name="D_ID") private BigDecimal dId; private String name; @ManyToMany @JoinTable(name="DEPT_EMP", joinColumns = @JoinColumn(name="D_ID", referencedColumnName = "D_ID"), inverseJoinColumns = @JoinColumn(name="E_ID", referencedColumnName = "E_ID")) private List<Employee> member; } @Entity public class Employee { @Id @Column(name="E_ID") private BigDecimal eId; private String name; @OneToOne(mappedBy="resident") private Address residence; @OneToMany(mappedBy="contact") private List<PhoneNumber> contactNumber; @ManyToMany(mappedBy="member") private List<Department> team; } @Entity public class Address { @Id @Column(name="E_ID", insertable=false, updatable=false) private BigDecimal eId; private String city; private String street; @OneToOne @JoinColumn(name="E_ID") private Employee resident; } @Entity @Table(name="PHONE_NUMBER") public class PhoneNumber { @Id @Column(name="P_ID") private BigDecimal pId; @ManyToOne @JoinColumn(name="E_ID", referencedColumnName = "E_ID") private Employee contact; private String num; }
JAXB Binding
In this example, the XML acessor type will be set to FIELD for all the model classes. This can be set as a package level JAXB annotation.
@XmlAccessorType(XmlAccessType.FIELD) package com.example.model; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType;
Relationships - Privately Owned
These relationships apply when the target object(s) is referenced by only a single source object. This type of relationship can be safely represented as nesting in XML (the default in JAXB).
One To One and Embedded
In JPA, the OneToOne and Embedded annotations indicate only one instance of the source entity is able to refer to the same target entity instance. Since the relationship between Employee and Address is bi-directional, use the EclipseLink extension @XmlInverseReference to represent the back-pointer.
@Entity public class Employee { @OneToOne(mappedBy="resident") private Address residence; } @Entity public class Address { @OneToOne @JoinColumn(name="E_ID") @XmlInverseReference(mappedBy="residence") private Employee resident; }
One To Many
In JPA, the OneToMany annotation indicates that only one instance of the source entity can refer to the same target entity instance. Since the relationship between Employee and Address is bi-directional, use the EclipseLink extension @XmlInverseReference to map the back-pointer.
@Entity public class Employee { @OneToMany(mappedBy="contact") private List<PhoneNumber> contactNumber; } @Entity public class PhoneNumber { @ManyToOne @JoinColumn(name="E_ID", referencedColumnName = "E_ID") @XmlInverseReference(mappedBy="contactNumber") private Employee contact; }
These relationships apply when the target object(s) may be referenced by multiple source objects. This type of relationship can not be safely represented as nesting in XML. So instead key relationships are used. To leverage the ID fields on JPA entities, EclipseLink JAXB allows the @XmlID annotation to be used on non-String fields/properties.
=Many To One
In JPA, the ManyToOne annotation indicates that one or more instances of the source entity are able to refer to the same target entity instance. Since the relationship between PhoneNumber and Employee is bi-directional, use the EclipseLink extension @XmlInverseReference to represent the back-pointer.
@Entity public class PhoneNumber { @ManyToOne @JoinColumn(name="E_ID", referencedColumnName = "E_ID") @XmlIDREF private Employee contact; } @Entity public class Employee { @Id @Column(name="E_ID") @XmlID private BigDecimal eId; @OneToMany(mappedBy="contact") @XmlInverseReference(mappedBy="contact") private List<PhoneNumber> contactNumber; }
Many To Many
In JPA, the ManyToMany annotation indicates that one or more instances of the source entity are able to refer to the same target entity instance. Since the relationship between Department and Employee is bi-directional, use the EclipseLink extension @XmlInverseReference to represent the back-pointer.
@Entity public class Department { @ManyToMany @JoinTable(name="DEPT_EMP", joinColumns = @JoinColumn(name="D_ID", referencedColumnName = "D_ID"), inverseJoinColumns = @JoinColumn(name="E_ID", referencedColumnName = "E_ID")) @XmlIDREF private List<Employee> member; } @Entity public class Employee { @Id @Column(name="E_ID") @XmlId private BigDecimal eId; @ManyToMany(mappedBy="member") @XmlInverseReference(mappedBy="member") private List<Department> team; }