Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "EclipseLink/UserGuide/MOXy/Relationships/Bidirectional Relationships"
Line 8: | Line 8: | ||
In order to map bidirectional relationships in EclipseLink MOXy, one of the properties must be annotated as an '''@XmlInverseReference'''. Without this annotation, the cyclic relationship will result in an infinite loop during marshalling. | In order to map bidirectional relationships in EclipseLink MOXy, one of the properties must be annotated as an '''@XmlInverseReference'''. Without this annotation, the cyclic relationship will result in an infinite loop during marshalling. | ||
+ | |||
+ | In this example, an '''Employee''' has a collection of '''PhoneNumbers''', and each '''PhoneNumber''' has a back-pointer back to its '''Employee''': | ||
+ | |||
+ | <source lang="java"> | ||
+ | @XmlAccessorType(XmlAccessType.FIELD) | ||
+ | public class Employee { | ||
+ | private String name; | ||
+ | private List<PhoneNumber> phones = new ArrayList<PhoneNumber>(); | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | --- | ||
+ | |||
+ | @XmlAccessorType(XmlAccessType.FIELD) | ||
+ | public class PhoneNumber { | ||
+ | private String number; | ||
+ | private Employee employee; | ||
+ | ... | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
When binding JPA entities to XML, there are MOXy extensions will help you map a bidirectional relationship. | When binding JPA entities to XML, there are MOXy extensions will help you map a bidirectional relationship. |
Revision as of 13:32, 19 April 2011
EclipseLink | |
Website | |
Download | |
Community | |
Mailing List • Forums • IRC • mattermost | |
Issues | |
Open • Help Wanted • Bug Day | |
Contribute | |
Browse Source |
Key API
Bidirectional Relationships
In order to map bidirectional relationships in EclipseLink MOXy, one of the properties must be annotated as an @XmlInverseReference. Without this annotation, the cyclic relationship will result in an infinite loop during marshalling.
In this example, an Employee has a collection of PhoneNumbers, and each PhoneNumber has a back-pointer back to its Employee:
@XmlAccessorType(XmlAccessType.FIELD) public class Employee { private String name; private List<PhoneNumber> phones = new ArrayList<PhoneNumber>(); ... } --- @XmlAccessorType(XmlAccessType.FIELD) public class PhoneNumber { private String number; private Employee employee; ... }
When binding JPA entities to XML, there are MOXy extensions will help you map a bidirectional relationship.
In this sample model, notice that Customer has a relationship to Address, and Address has a relationship back to Customer. In JPA, one direction of the relationship is mapped (the customer property on Address); the other direction specifies a mapping to leverage.
Sample Model
import javax.persistence.*; @Entity public class Customer { @Id private long id; @OneToOne(mappedBy="customer", cascade={CascadeType.ALL}) private Address address; } import javax.persistence.*; @Entity public class Address implements Serializable { @Id private long id; @MapsId @OneToOne @JoinColumn(name="ID") private Customer customer; }
To marshal these objects to XML, mark one direction @XmlTransient' to prevent a JAXB infinite loop during marshalling. Normally, during unmarshalling (from XML-to-object), you are responsible for populating the back pointer
import javax.persistence.*; import javax.xml.bind.annotation.*; @Entity public class Address implements Serializable { @Id private long id; @OneToOne @JoinColumn(name="ID") @MapsId @XmlTransient private Customer customer; }
@XMLInverseReference
With the @XmlInverseReference annotation, MOXy will populate the back pointer automatically. In this sample, notice that the @XmlInverseReference annotation leverages the same "mappedBy" concept.
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; }