OpenJPA Logo   ASF Logo

Embeddable classes

An entity may use other fine-grained classes to represent entity state. Instances of these classes, unlike entity instances, do not have persistent identity of their own. Instead, they exist only as part of the state of the entity to which they belong. (From 2.0 Proposed Final Draft March 13, 2009 -- do I need to provide footnote or something?)

In short, an embeddable is a seperation of data into a Java class that relies on the owning Entity for it's identity. Many(most) times an embeddable resides in the same database row as the owning Entity.

Review the getting started page on how to run the samples.

Samples

Schema

Class diagram

Collections of Embeddables

In the code snippet below, there is a User Entity which has a collection of Embedded addresses.

Address.java|borderStyle=solid

@Embeddable
public class Address {
    @Basic
    private String street;
    @Basic
    private String city;
    @Basic
    private String state;
    @Basic
    private Integer zip;

    public Address(){
    }
//...
}


User.java|borderStyle=solid
@Entity public class User { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id;

    @ElementCollection
    @CollectionTable(name="user_address")
    private Set<Address> addresses = new HashSet<Address>();

    public User(){
    }
//...
}


JPQL.java|borderStyle=solid

...
// Select Entity based off a query over a collection of embeddables
Query q = em.createQuery("SELECT u FROM User u , in (u.addresses) a WHERE a.state='xx'");
// TODO -- add more!
...

Relationships from Embeddables

In the code snippet below, there is an Address embeddable with a ManyToOne relationship to a Coordinates Entity.

Address.java|borderStyle=solid

@Embeddable
public class Address {
    @Basic
    private String street;
    @Basic
    private String city;
    @Basic
    private String state;
    @Basic
    private Integer zip;

    @ManyToOne(cascade=CascadeType.ALL)
    Coordinates coordinates;

    public Address(){
    }
//...
}

Coordinates .java|borderStyle=solid

@Entity
public class Coordinates {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    int id;

    @Basic
    double longitude;
    @Basic
    double latitude;
    public Coordinates(){
    }
    public Coordinates(double lon, double lat){
        longitude=lon;
        latitude=lat;
    }
//...
}

JPQL.java|borderStyle=solid

...
// Embedded -> relationship traversal
Query q = em.createQuery("SELECT u FROM User u , in (u.addresses) a WHERE a.coordinates.longitude=xxx");
// TODO -- add more!
...

Nested Embeddables

In the code snippet below, there is a User Entity which has an embedded ContactInfo. ContactInfo contains two other embeddeded embeddables, Address and Phone.

Address.java|borderStyle=solid

@Embeddable
public class Address {
    @Basic
    private String street;
    @Basic
    private String city;
    @Basic
    private String state;
    @Basic
    private Integer zip;

    public Address(){
    }
//...
}

Phone.java|borderStyle=solid

@Embeddable
public class Phone {
    @Basic
    private String phone_number;
    @Basic
    private String phone_type;
//...
}

ContactInfo.java|borderStyle=solid

@Embeddable
public class ContactInfo {
    public ContactInfo(){   
    }

    @Embedded
    Address homeAddress;

    @Embedded
    Phone homePhone;
//...
}

User.java|borderStyle=solid

@Entity
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    @Embedded
    ContactInfo contactInfo;

    public User(){
    }
//...
}

JPQL.java|borderStyle=solid

...
// Nested embeddables traversal
Query q = em.createQuery("SELECT u FROM User u WHERE u.contactInfo.homePhone.number='507-555-5555' " +
    "AND u.contactInfo.homePhone.type='cell'");
// TODO -- add more!
...
Copyright © 2006,2020 The Apache Software Foundation. Licensed under Apache License 2.0.
Apache, the Apache feather logo and OpenJPA are trademarks of The Apache Software Foundation.
Other names may be trademarks of their respective owners.