Notice: this Wiki will be going read only early in 2024 and edits will no longer be 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) |
(→Target Object) |
||
Line 87: | Line 87: | ||
} | } | ||
</source> | </source> | ||
− | |||
− | |||
Then we must specify the XPath to the XML nodes which represent the ID. | Then we must specify the XPath to the XML nodes which represent the ID. | ||
Line 95: | Line 93: | ||
import org.eclipse.persistence.config.DescriptorCustomizer; | import org.eclipse.persistence.config.DescriptorCustomizer; | ||
import org.eclipse.persistence.descriptors.ClassDescriptor; | import org.eclipse.persistence.descriptors.ClassDescriptor; | ||
− | |||
public class EmployeeCustomizer implements DescriptorCustomizer { | public class EmployeeCustomizer implements DescriptorCustomizer { | ||
public void customize(ClassDescriptor descriptor) throws Exception { | public void customize(ClassDescriptor descriptor) throws Exception { | ||
− | |||
− | |||
− | |||
− | |||
descriptor.addPrimaryKeyFieldName("eId/text()"); | descriptor.addPrimaryKeyFieldName("eId/text()"); | ||
descriptor.addPrimaryKeyFieldName("country/text()"); | descriptor.addPrimaryKeyFieldName("country/text()"); | ||
} | } | ||
− | }</source> | + | } |
+ | </source> | ||
=== Source Object === | === Source Object === |
Revision as of 17:10, 1 December 2009
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") }) @XmlIDREF private Employee contact; }
@Entity @IdClass(EmployeeId.class) public class Employee { @Id @Column(name="E_ID") @XmlID private BigDecimal eId; @Id @XmlID private String country; @OneToMany(mappedBy="contact") @XmlInverseReference(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 the EclipseLink extension @XmlCustomizer. Also since the relationship is bidirectional, we will use the EclipseLink extension @XmlInverseReference.
@Entity @IdClass(EmployeeId.class) @XmlCustomizer(EmployeeCustomizer.class) public class Employee { @Id @Column(name="E_ID") @XmlID private BigDecimal eId; @Id @XmlID private String country; @OneToMany(mappedBy="contact") @XmlInverseReference(mappedBy="contact") private List<PhoneNumber> contactNumber; }
Then we must specify the XPath to the XML nodes which represent the ID.
import org.eclipse.persistence.config.DescriptorCustomizer; import org.eclipse.persistence.descriptors.ClassDescriptor; public class EmployeeCustomizer implements DescriptorCustomizer { public void customize(ClassDescriptor descriptor) throws Exception { descriptor.addPrimaryKeyFieldName("eId/text()"); descriptor.addPrimaryKeyFieldName("country/text()"); } }
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 mark the field @XmlTransient, and use the EclipseLink extension @XmlCustomizer to set up the mapping.
@Entity @XmlCustomizer(PhoneNumberCustomizer.class) public class PhoneNumber { @ManyToOne @JoinColumns({ @JoinColumn(name="E_ID", referencedColumnName = "E_ID"), @JoinColumn(name="E_COUNTRY", referencedColumnName = "COUNTRY") }) @XmlTransient private Employee contact; }
An XMLObjectReferenceMapping will be created. The mapping will include multiple key mappings.
import org.eclipse.persistence.config.DescriptorCustomizer; import org.eclipse.persistence.descriptors.ClassDescriptor; import org.eclipse.persistence.oxm.mappings.XMLObjectReferenceMapping; public class PhoneNumberCustomizer implements DescriptorCustomizer { public void customize(ClassDescriptor descriptor) throws Exception { XMLObjectReferenceMapping contactMapping = new XMLObjectReferenceMapping(); contactMapping.setAttributeName("contact"); contactMapping.setReferenceClass(Employee.class); contactMapping.addSourceToTargetKeyFieldAssociation("contact/@eID", "eId/text()"); contactMapping.addSourceToTargetKeyFieldAssociation("contact/@country", "country/text()"); descriptor.addMapping(contactMapping); } }