Jump to: navigation, search

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.
 +
 +
'''@XmlInverseReferences''' must specify the '''mappedBy''' attribute, which indicates the property on the opposite side of the relationship.
  
 
In this example, an '''Employee''' has a collection of '''PhoneNumbers''', and each '''PhoneNumber''' has a back-pointer back to its '''Employee''':
 
In this example, an '''Employee''' has a collection of '''PhoneNumbers''', and each '''PhoneNumber''' has a back-pointer back to its '''Employee''':
Line 22: Line 24:
 
public class PhoneNumber {
 
public class PhoneNumber {
 
   private String number;
 
   private String number;
 +
  @XmlInverseReference(mappedBy="phones")
 
   private Employee employee;
 
   private Employee employee;
 
   ...
 
   ...

Revision as of 12:34, 19 April 2011


link="http://wiki.eclipse.org/EclipseLink"
EclipseLink
Website
Download
Community
Mailing ListForumsIRC
Bugzilla
Open
Help Wanted
Bug Day
Contribute
Browse Source


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.

@XmlInverseReferences must specify the mappedBy attribute, which indicates the property on the opposite side of the relationship.

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;
   @XmlInverseReference(mappedBy="phones")
   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;
 
}


Eclipselink-logo.gif
Version: 2.2.0 DRAFT
Other versions...