Skip to main content
Jump to: navigation, search

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

m (New page: =Keys and Foreign Keys= This example demonstrates how to derive an XML representation from a set of JPA entities using JAXB when a JPA entity has compound primary keys. == JPA Entities =...)
 
m
Line 1: Line 1:
 +
{{EclipseLink_UserGuide
 +
|info=y
 +
|toc=n
 +
|eclipselink=y
 +
|eclipselinktype=MOXy
 +
}}
  
 
=Keys and Foreign Keys=
 
=Keys and Foreign Keys=
Line 105: Line 111:
 
}
 
}
 
</source>
 
</source>
 +
 +
 +
{{EclipseLink_MOXy
 +
|previous= [[EclipseLink/UserGuide/MOXy/Mapping_JPA_Entities_to_XML/Bidirectional_Relationships|Bidirectional Relationships]]
 +
|up=    [[EclipseLink/UserGuide/MOXy/Mapping_JPA_Entities_to_XML|Mapping JPA Entities to XML]]
 +
|next=      [[EclipseLink/UserGuide/MOXy/Web_Services|Web Services]]
 +
|version=2.2.0 }}

Revision as of 13:39, 11 April 2011

EclipseLink MOXy

Eclipselink-logo.gif
EclipseLink
Website
Download
Community
Mailing ListForumsIRCmattermost
Issues
OpenHelp WantedBug Day
Contribute
Browse Source


Keys and Foreign Keys

This example demonstrates how to derive an XML representation from a set of JPA entities using JAXB when a JPA entity has compound primary keys.

JPA Entities

@Entity
public class PhoneNumber {
 
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="E_ID", referencedColumnName = "E_ID"),
        @JoinColumn(name="E_COUNTRY", referencedColumnName = "COUNTRY")
    })
 
    private Employee contact;
 
}
@Entity
@IdClass(EmployeeId.class)
public class Employee {
 
    @Id
    @Column(name="E_ID")
    private BigDecimal eId;
 
    @Id
    private String country;
 
    @OneToMany(mappedBy="contact")
    private List<PhoneNumber> contactNumber;
 
}
public class EmployeeId {
 
    private BigDecimal eId;
    private String country;
 
}

JAXB Bindings

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;

Target Object

Because this example requires support beyond the JAXB specification, you can use the EclipseLink extension @XmlKey. Because the relationship is bidirectional, use the EclipseLink extension @XmlInverseReference.

@Entity
@IdClass(EmployeeId.class)
public class Employee {
 
    @Id
    @Column(name="E_ID")
    @XmlID
    private BigDecimal eId;
 
    @Id
    @XmlKey
    private String country;
 
    @OneToMany(mappedBy="contact")
    @XmlInverseReference(mappedBy="contact")
    private List<PhoneNumber> contactNumber;
 
}

Source Object

Because the target object has a compound key, use the EclipseLink extension @XmlJoinNodes to set up the mapping.

Note: If the target object had a single ID, then you could use @XmlIDREF.

@Entity
public class PhoneNumber {
 
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="E_ID", referencedColumnName = "E_ID"),
        @JoinColumn(name="E_COUNTRY", referencedColumnName = "COUNTRY")
    })
    @XmlJoinNodes( {
        @XmlJoinNode(xmlPath="contact/id/text()", referencedXmlPath="id/text()"),
        @XmlJoinNode(xmlPath="contact/country/text()", referencedXmlPath="country/text()")
    })
    private Employee contact;
 
}


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

Copyright © Eclipse Foundation, Inc. All Rights Reserved.