Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

...

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

\< IMAGE \\\>

Table of Contents
minLevel2
indent20px
styledisc

Schema

Class diagram

Image Added

Image Added

#Collections of Embeddables
#Relationships from Embeddables
#Nested Embeddables

Collections of Embeddables

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

Code Block
titleAddress.java
borderStylesolid
@Embeddable
public class Address {
	@Basic
	private String street;
	@Basic
	private String city;
	@Basic
	private String state;
	@Basic
	private Integer zip;

	public Address(){
	}
//...
}
Code Block
titleUser2User.java
borderStylesolid
@Entity
public class User2User {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;

	@ElementCollection
	@CollectionTable(name="user_addressesaddress")
	@OrderColumn
	private Set<Address> addresses = new HashSet<Address>();
	
	public User2User(){
	}
//...
}
Code Block
titleJPQL.java
borderStylesolid

...
// 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

...

Code Block
titleCoordinates .java
borderStylesolid
@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;
	}
//...
}
Code Block
titleJPQL.java
borderStylesolid

...
// 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.

...

Code Block
titlePhone.java
borderStylesolid
@Embeddable
public class Phone {
	@Basic
	private String phone_number;
	@Basic
	private String phone_type;
//...
}
Code Block
titleContactInfo.java
borderStylesolid
@Embeddable
public class ContactInfo {
	public ContactInfo(){	
	}
	
	@Embedded
	Address homeAddress;
	
	@Embedded
	Phone homePhone;
//...
}
Code Block
titleUser.java
borderStylesolid
@Entity
public class User {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;
	@Embedded
	ContactInfo contactInfo;
	
	public User(){
	}
//...
}
Code Block
titleJPQL.java
borderStylesolid

...
// 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!
...