Difference between revisions of "EclipseLink/UserGuide/MOXy/Mapping JPA Entities to XML"

From Eclipsepedia

Jump to: navigation, search
m (Relationships - Privately Owned)
m
 
(2 intermediate revisions by one user not shown)
Line 1: Line 1:
{{EclipseLink_UserGuide
+
'''[[Image:Elug_draft_icon.png|Warning]] This page is obsolete. Please see ''[http://www.eclipse.org/eclipselink/documentation/ Developing JAXB Applications Using EclipseLink MOXy]'' for current information.'''
|info=y
+
|toc=y
+
|eclipselink=y
+
|eclipselinktype=MOXy
+
}}
+
=Mapping JPA Entities to XML=
+
This section demonstrates three strategies for mapping JPA entities to XML:
+
* [[#Binding JPA Relationships 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.
+
 
+
<source lang="java">
+
@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;
+
+
}
+
</source>
+
 
+
==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.
+
 
+
<source lang="java">
+
@XmlAccessorType(XmlAccessType.FIELD)
+
package com.example.model;
+
+
import javax.xml.bind.annotation.XmlAccessType;
+
import javax.xml.bind.annotation.XmlAccessorType;
+
</source>
+
 
+
 
+
 
+
==Relationships - Shared Reference==
+
 
+
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.
+
 
+
<source lang="java">
+
@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;
+
+
}
+
</source>
+
 
+
==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.
+
 
+
<source lang="java">
+
@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;
+
+
}
+
</source>
+
 
+
= Binding Compound Primay Keys to XML=
+
 
+
= Binding Embedded ID Classes to XML =
+
 
+
 
+
{{EclipseLink_MOXy
+
|previous=    n
+
|next= [[EclipseLink/UserGuide/MOXy/Overview/MOXy|MOXy Overview]]
+
|up=      [[EclipseLink/UserGuide/MOXy|MOXy User Guide]]
+
|version=2.2.0 DRAFT}}
+

Latest revision as of 13:13, 30 January 2013

Warning This page is obsolete. Please see Developing JAXB Applications Using EclipseLink MOXy for current information.