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"
(→Relationship – One To One (Privately Owned)) |
(→JAXB Binding) |
||
Line 128: | Line 128: | ||
</source> | </source> | ||
− | === | + | ==== One To Many ==== |
− | This relationship applies when an object | + | This relationship applies when an object privately owns a collection of data objects. In JPA the OneToMany annotation indicates that only one instance of the source entity is able to refer to the same target entity instance. This type of relationship can safely be represented through nesting in XML (the default in JAXB). Since the relationship between Employee and Address is bi-directional, we need to mark one side transient in JAXB to prevent a cycle. |
<source lang="java"> | <source lang="java"> | ||
@Entity | @Entity | ||
− | public class | + | public class Employee { |
− | @ | + | @OneToMany(mappedBy="contact") |
− | + | private List<PhoneNumber> contactNumber; | |
− | private | + | |
} | } | ||
Line 145: | Line 144: | ||
<source lang="java"> | <source lang="java"> | ||
@Entity | @Entity | ||
− | public class | + | public class PhoneNumber { |
− | @ | + | @ManyToOne |
− | private | + | @JoinColumn(name="E_ID", referencedColumnName = "E_ID") |
+ | @XmlTransient | ||
+ | private Employee contact; | ||
} | } | ||
</source> | </source> | ||
− | === | + | === Shared Reference Relationships === |
− | This relationship applies when an object privately | + | ==== Many To One ==== |
+ | |||
+ | This relationship applies when an object references but does not privately own another data object. In JPA the ManyToOne annotation indicates that one or more instances of the source entity are able to refer to the same target entity instance. | ||
<source lang="java"> | <source lang="java"> | ||
@Entity | @Entity | ||
− | public class | + | public class PhoneNumber { |
− | @ | + | @ManyToOne |
− | private | + | @JoinColumn(name="E_ID", referencedColumnName = "E_ID") |
+ | private Employee contact; | ||
} | } | ||
Line 169: | Line 173: | ||
<source lang="java"> | <source lang="java"> | ||
@Entity | @Entity | ||
− | public class | + | public class Employee { |
− | @ | + | @OneToMany(mappedBy="contact") |
− | + | private List<PhoneNumber> contactNumber; | |
− | + | ||
− | private | + | |
} | } | ||
</source> | </source> | ||
− | === | + | ==== Many To Many ==== |
This relationship applies when an object references but does not privately own a collection of data objects. In JPA the ManyToMany annotation indicates that one or more instances of the source entity are able to refer to the same target entity instance. | This relationship applies when an object references but does not privately own a collection of data objects. In JPA the ManyToMany annotation indicates that one or more instances of the source entity are able to refer to the same target entity instance. |
Revision as of 09:59, 1 October 2009
Contents
Overview
This example demonstrates how to derive an XML representation from a set of JPA entities using JAXB. In simplest terms JAXB will be used to apply a tree structure to the object graph of JPA entities.
JPA Entities
For this example the following JPA entities will be used. In order to save space package names, import statements, and the get /set methods have been omitted from the following code samples. All annotations shown below are standard JPA annotations.
@Entity public class Department { @Id @Column(name="D_ID") private BigDecimal dId; private String name; @ManyToMany @JoinTable(name="DEPT_EMP", joinColumns = @JoinColumn(name="D_ID", referencedColumnName = "D_ID"), inverseJoinColumns = @JoinColumn(name="E_ID", referencedColumnName = "E_ID")) private List<Employee> member; }
@Entity public class Employee { @Id @Column(name="E_ID") private BigDecimal eId; private String name; @OneToOne(mappedBy="resident") private Address residence; @OneToMany(mappedBy="contact") private List<PhoneNumber> contactNumber; @ManyToMany(mappedBy="member") private List<Department> team; }
@Entity public class Address { @Id @Column(name="E_ID", insertable=false, updatable=false) private BigDecimal eId; private String city; private String street; @OneToOne @JoinColumn(name="E_ID") private Employee resident; }
@Entity @Table(name="PHONE_NUMBER") public class PhoneNumber { @Id @Column(name="P_ID") private BigDecimal pId; @ManyToOne @JoinColumn(name="E_ID", referencedColumnName = "E_ID") private Employee contact; private String num; }
JAXB Binding
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 annotation.
@XmlAccessorType(XmlAccessType.FIELD) package com.example.model; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType;
Privately Owned Relationships
These relationships apply when the target object(s) is only referenced by a single source object. This type of relationship can be safely represented as nesting in XML (the default in JAXB).
One To One
In JPA the OneToOne annotation indicates that only one instance of the source entity is able to refer to the same target entity instance. Since the relationship between Employee and Address is bi-directional, we need to mark one side transient in JAXB to prevent a cycle.
@Entity public class Employee { @OneToOne(mappedBy="resident") private Address residence; }
@Entity public class Address { @OneToOne @JoinColumn(name="E_ID") @XmlTransient private Employee resident; }
One To Many
This relationship applies when an object privately owns a collection of data objects. In JPA the OneToMany annotation indicates that only one instance of the source entity is able to refer to the same target entity instance. This type of relationship can safely be represented through nesting in XML (the default in JAXB). Since the relationship between Employee and Address is bi-directional, we need to mark one side transient in JAXB to prevent a cycle.
@Entity public class Employee { @OneToMany(mappedBy="contact") private List<PhoneNumber> contactNumber; }
@Entity public class PhoneNumber { @ManyToOne @JoinColumn(name="E_ID", referencedColumnName = "E_ID") @XmlTransient private Employee contact; }
Many To One
This relationship applies when an object references but does not privately own another data object. In JPA the ManyToOne annotation indicates that one or more instances of the source entity are able to refer to the same target entity instance.
@Entity public class PhoneNumber { @ManyToOne @JoinColumn(name="E_ID", referencedColumnName = "E_ID") private Employee contact; }
@Entity public class Employee { @OneToMany(mappedBy="contact") private List<PhoneNumber> contactNumber; }
Many To Many
This relationship applies when an object references but does not privately own a collection of data objects. In JPA the ManyToMany annotation indicates that one or more instances of the source entity are able to refer to the same target entity instance.
@Entity public class Department { @Id @Column(name="D_ID") private BigDecimal dId; private String name; @ManyToMany @JoinTable(name="DEPT_EMP", joinColumns = @JoinColumn(name="D_ID", referencedColumnName = "D_ID"), inverseJoinColumns = @JoinColumn(name="E_ID", referencedColumnName = "E_ID")) private List<Employee> member; }
@Entity public class Employee { @ManyToMany(mappedBy="member") private List<Department> team; }