Jump to: navigation, search

Difference between revisions of "EclipseLink/UserGuide/MOXy/Relationships/Bidirectional Relationships"

m (Bidirectional Relationships)
m
Line 1: Line 1:
 
{{EclipseLink_UserGuide
 
{{EclipseLink_UserGuide
 
|info=y
 
|info=y
|api=n
+
|api=y
|apis=
+
|apis=* [http://www.eclipse.org/eclipselink/api/latest/org/eclipse/persistence/mappings/XMLTransient.html XMLTransient]
 +
* [http://www.eclipse.org/eclipselink/api/latest/org/eclipse/persistence/mappings/XMLInverseReferenceMapping.html XMLInverseReferenceMapping]
 
}}  
 
}}  
 
= Bidirectional Relationships  =
 
= Bidirectional Relationships  =
When binding JPA entities to XML  
+
When binding JPA entities to XML, there are MOXy extensions will help you map a bidirectional relationship
 
+
JAXB is your best choice when binding Java objects to XML.  But what happens when those Java objects turn out to be JPA entities?  For the most part it is business as usual, although there are a couple things to be aware of.  In this post we'll cover a MOXy extension that can be used to 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.
 
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.
Line 97: Line 94:
 
|previous=[[EclipseLink/UserGuide/MOXy/Relationships/Collections and Maps|Collections and Maps]]
 
|previous=[[EclipseLink/UserGuide/MOXy/Relationships/Collections and Maps|Collections and Maps]]
 
|up      =[[EclipseLink/UserGuide/MOXy/Relationships|Relationships]]
 
|up      =[[EclipseLink/UserGuide/MOXy/Relationships|Relationships]]
|next    =[[EclipseLink/UserGuide/MOXy/Relationships/Bidirectional Relationships/XMLInverseMapping|XMLInverseMapping]]
+
|next    =[[EclipseLink/UserGuide/MOXy/Advanced XML Schema Concepts|Advanced XML Schema Concepts]]
 
|version=2.2.0 DRAFT
 
|version=2.2.0 DRAFT
 
}}
 
}}

Revision as of 11:35, 5 April 2011


Bidirectional Relationships

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...