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/Examples/MOXy/JPA/CompoundPrimaryKeys"
(→Target Object) |
|||
(One intermediate revision by the same user not shown) | |||
Line 86: | Line 86: | ||
=== Source Object === | === Source Object === | ||
− | If the target object had a single ID then we would use @XmlIDREF. Since the target object has a compound key, we will | + | If the target object had a single ID then we would use @XmlIDREF. Since the target object has a compound key, we will use the EclipseLink extension @XmlJoinNodes to set up the mapping. |
<source lang="java"> | <source lang="java"> | ||
@Entity | @Entity | ||
− | |||
public class PhoneNumber { | public class PhoneNumber { | ||
Line 98: | Line 97: | ||
@JoinColumn(name="E_COUNTRY", referencedColumnName = "COUNTRY") | @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; | private Employee contact; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
</source> | </source> |
Latest revision as of 16:34, 16 March 2011
Overview
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
For 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
As we require support beyond the JAXB spec, we will make use of the EclipseLink extension @XmlKey. Also since the relationship is bidirectional, we will 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
If the target object had a single ID then we would use @XmlIDREF. Since the target object has a compound key, we will use the EclipseLink extension @XmlJoinNodes to set up the mapping.
@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; }