Jump to: navigation, search


< EclipseLink‎ | Examples‎ | JPA
Revision as of 15:25, 13 August 2009 by David.minsky.oracle.com (Talk | contribs) (Example of Expression criteria relationship)

Normally in the database a relationship is defined through a foreign key, either from the source table to the target table (ManyToOne), or from the target table to the source table (OneToMany). However, sometimes a relationship is more complex, and involves a comparison or computation. The JPA specification only allows relationships to be defines using foreign keys (JoinColumn), but EclipseLink also provides and extended Expression criteria API to allow complex relationships to be defined.

Consider a Department that has a "manager" relationship to Employee. Instead of having a foreign key to its manager, the Employee has a foreign key to its Department, and an additional field that defines the Employee's position. EclipseLink does not currently define an annotation to define an Expression relationship so a DescriptorCustomizer can be used.

Example of Expression criteria relationship

public class Department {
    private long id;
    private Employee manager;
    private List<Employee> employees;
public class Employee {
    private long id;
    private Department department;
import org.eclipse.persistence.config.DescriptorCustomizer;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.mappings.OneToOneMapping;

public class DepartmentCustomizer implements DescriptorCustomizer {

    public void customize(ClassDescriptor descriptor) {
        OneToOneMapping mapping = (OneToOneMapping)descriptor.getMappingForAttributeName("manager");
        ExpressionBuilder builder = new ExpressionBuilder();