Java Persistence API L Grewe Java Persistence API

  • Slides: 38
Download presentation
Java Persistence API L. Grewe

Java Persistence API L. Grewe

Java Persistence API n n Replaces Entity Beans in Java EE API the API

Java Persistence API n n Replaces Entity Beans in Java EE API the API itself, defined in the javax. persistence package the Java Persistence Query Language (JPQL)

An Entity n n n A persistence entity is a lightweight Java class whose

An Entity n n n A persistence entity is a lightweight Java class whose state is typically persisted to a table in a relational database. correspond to individual rows in the table. Object/relational metadata can be specified directly in the entity class file by using annotations, or in a separate XML descriptor file distributed with the application.

Advantage over previous Entity Beans n n DO NOT need an EJB container or

Advantage over previous Entity Beans n n DO NOT need an EJB container or a Java EE application server in order to run applications that use persistence Entity Beans perceived as too complication and programmers had turned to third-party non- entity bean solutions

Defining Entity Beans Full Object/Relational Database Mapping

Defining Entity Beans Full Object/Relational Database Mapping

EJB 3. 0 Entity Beans n O/R Mapping Metadata as annotations • Table mappings,

EJB 3. 0 Entity Beans n O/R Mapping Metadata as annotations • Table mappings, @Table, @Secondary. Table • Column mappings, @Column, @Join. Column • Relationships, @Many. To. One, @One. To. Many, @Many. To. Many • Multi-Table mappings, @Secondary. Table • Embedded objects, @Embedded • Inheritance, @Discriminator. Column • Identifier + Version properties, @Id, @Version

Entity Annotations @Entity @Table(name=“AUCTION_ITEM”) public class Item { private long id; private String description;

Entity Annotations @Entity @Table(name=“AUCTION_ITEM”) public class Item { private long id; private String description; private String product. Name; private Set<Bid> bids = new Hash. Set(); private User seller; @Id @Generated. Value @Column(name=“ITEM_ID”) public long get. Id() { return id; } public void set. Id(long id) { this. id = id; } relational table declaration auto-key generation

Entity Annotations @Entity @Table(name=“AUCTION_ITEM”) public class Item { private long id; private String description;

Entity Annotations @Entity @Table(name=“AUCTION_ITEM”) public class Item { private long id; private String description; private String product. Name; private Set<Bid> bids = new Hash. Set(); private User seller; @Id @Generated. Value @Column(name=“ITEM_ID”) public long get. Id() { return id; } public void set. Id(long id) { this. id = id; } create table AUCTION_ITEM ( ITEM_ID Number, DESC varchar(255), Product. Name varchar(255), USER_ID Number );

Entity Annotations … @Column(name=“DESC”, length=500) public String get. Description() { return description; } public

Entity Annotations … @Column(name=“DESC”, length=500) public String get. Description() { return description; } public void set. Description(String desc) { this. description = desc; } column mapping public String get. Product. Name() { intuitive defaults return product. Name; } protected void set. Product. Name(String name) { this. product. Name = name; }

Relationships n Relationships, • @Many. To. One, @One. To. Many, @Many. To. Many •

Relationships n Relationships, • @Many. To. One, @One. To. Many, @Many. To. Many • Supports lazy and eager loading of relationships • Cascades: delete, create, and merge • No CMR: You must manage your relationships.

Entity Relationships @One. To. One(fetch=LAZY) @Join. Column(name=“OWNER_ID”) public Owner get. Owner() { return owner;

Entity Relationships @One. To. One(fetch=LAZY) @Join. Column(name=“OWNER_ID”) public Owner get. Owner() { return owner; } lazy/eager loading public void set. Owner(Owner owner) { this. owner = owner; } @One. To. Many(cascade=ALL) @Join. Column(name=“ITEM_ID”) public Set<Bid> get. Bids() { return bids; } public void set. Bids(Set<Bid> bids) { this. bids = bids; } various cascade types

Entity Relationships @One. To. One(fetch=LAZY) @Join. Column(name=“OWNER_ID”) public Owner get. Owner() { return owner;

Entity Relationships @One. To. One(fetch=LAZY) @Join. Column(name=“OWNER_ID”) public Owner get. Owner() { return owner; } public void set. Owner(Owner user) { this. owner = owner; } @One. To. Many(cascade=ALL) @Join. Column(name=“ITEM_ID”) public Set<Bid> get. Bids() { return bids; } public void set. Bids(Set<Bid> bids) { this. bids = bids; } create table AUCTION_ITEM ( ITEM_ID Number, DESC varchar(255), Product. Name varchar(255), OWNER_ID Number ); create table BID ( … ITEM_ID Number … );

No CMR @One. To. Many(cascade=ALL) @Join. Column(name=“ITEM_ID”) public Set<Bid> get. Bids() { return bids;

No CMR @One. To. Many(cascade=ALL) @Join. Column(name=“ITEM_ID”) public Set<Bid> get. Bids() { return bids; } public void add. Bid(Bid bid) { get. Bids(). add(bid); bid. set. Item(this); }

Multi-Table n Multi-Table Mappings, • Entity can be stored in one or more tables

Multi-Table n Multi-Table Mappings, • Entity can be stored in one or more tables • @Secondary. Tables, @Secondary. Table

Multi-table Mappings @Entity @Secondary. Table(name=“ADDRESS”, pk. Join. Columns= @Primary. Key. Join. Column(name=“ADDR_I D”)) public

Multi-table Mappings @Entity @Secondary. Table(name=“ADDRESS”, pk. Join. Columns= @Primary. Key. Join. Column(name=“ADDR_I D”)) public class Owner { private long id; private String name; private String street; private String city; private String state; @Id @Generated. Value public long get. Id() { return id; } public void set. Id(long id) { this. id = id; } create table OWNER ( ID Number, NAME varchar(255), ); create table ADDRESS ( ADDR_ID Number, STREET varchar(255), CITY varchar(255), STATE varchar(255) ); z

Multi-Table Mappings @Column(name=“STREET”, table=“ADDRESS”) public String get. Street() { return street; } public void

Multi-Table Mappings @Column(name=“STREET”, table=“ADDRESS”) public String get. Street() { return street; } public void set. Street(String street) { this. street = street; } @Column(name=“CITY”, table=“ADDRESS”) public String get. City() { return city; } protected void set. City(String city) { this. city = city; } create table OWNER ( ID Number, NAME varchar(255), ); create table ADDRESS ( ADDR_ID Number, STREET varchar(255), CITY varchar(255), STATE varchar(255) );

Embedded Objects n Embedded Objects • Aggregated objects whose properties can be mapped •

Embedded Objects n Embedded Objects • Aggregated objects whose properties can be mapped • @Embedded, @Embeddable

Embedded Objects @Entity public class Owner { private long id; private String name; private

Embedded Objects @Entity public class Owner { private long id; private String name; private Address address; @Id @Generated. Value public long get. Id() { return id; } public void set. Id(long id) { this. id = id; } @Embeddable public class Address { private String street; private String city; private String state; @Column(“STREET”) public String get. Street() { return street; } public void set. Street(String street) { this. street = street; } public String get. Name() { public String get. City() { return city; }

Embedded … @Embedded({ @Attribute. Override(name=“street”, @Column(name=“STREET”)), @Attribute. Override(name=“city”, @Column(name=“CITY”)), @Attribute. Override(name=“state”, @Column(name=“STATE”))}) public Address

Embedded … @Embedded({ @Attribute. Override(name=“street”, @Column(name=“STREET”)), @Attribute. Override(name=“city”, @Column(name=“CITY”)), @Attribute. Override(name=“state”, @Column(name=“STATE”))}) public Address get. Address() { return address; } public void set. Address(Address address) { this. address = address; } …

Composite Keys/Primary Key Classes n EJB 2. 1 style primary keys • Same idea

Composite Keys/Primary Key Classes n EJB 2. 1 style primary keys • Same idea as @Embedded • @Embedded. Id, @Embeddable, @Id. Class

Composite Keys @Entity public class Owner { private Owner. PK pk; private Address address;

Composite Keys @Entity public class Owner { private Owner. PK pk; private Address address; @Embedded. Id public Owner. PK get. Id() { return id; } public void set. Id(Owner. PK id) { this. id = id; } @Embeddable public class Owner. PK { private String name; private long ssn; @Column(“NAME”) public String get. Name() { return street; } public long get. SSN() { return sn; } …

Composite Keys @Entity @Id. Class(Owner. PK. class) public class Owner { @Id String name;

Composite Keys @Entity @Id. Class(Owner. PK. class) public class Owner { @Id String name; @Id long ssn; @Embedded Address address; … } @Embeddable public class Owner. PK { private String name; private long ssn; @Column(“NAME”) public String get. Name() { return street; } public long get. SSN() { return sn; } …

Inheritance n Persistence mapping supports inheritance • • • n Single table per hierarchy

Inheritance n Persistence mapping supports inheritance • • • n Single table per hierarchy – SINGLE_TABLE Join table per subclass – JOINED Distinct table per subclass – TABLE_PER_CLASS Queries on class hierarchy are polymorphic

Inheritance – SINGLE_TABLE @Entity @Table(name="Animal") @Inheritance(strategy=Inheritance. Type. SINGLE_TABLE) @Discriminator. Column(name="TYPE") public class Animal {

Inheritance – SINGLE_TABLE @Entity @Table(name="Animal") @Inheritance(strategy=Inheritance. Type. SINGLE_TABLE) @Discriminator. Column(name="TYPE") public class Animal { @Id private int id; @Column(name="AVG_WEIGHT") private int average. Weight; . . . } @Entity @Inheritance(strategy=Inheritance. Type. SINGLE_TABLE) public class Dog extends Animal{ @Column(name="BREED") private String breed; . . . }

Inheritance – SINGLE_TABLE create table Animal ( ID Number, TYPE varchar(255), AVG_WEIGHT Number, BREED

Inheritance – SINGLE_TABLE create table Animal ( ID Number, TYPE varchar(255), AVG_WEIGHT Number, BREED varchar(255) );

Inheritance – JOINED @Entity @Inheritance(strategy=Inheritance. Type. JOINED) public class Animal{ @Id private int id;

Inheritance – JOINED @Entity @Inheritance(strategy=Inheritance. Type. JOINED) public class Animal{ @Id private int id; @Column(name="AVG_WEIGHT") private int average. Weight; . . . } @Entity @Inheritance. Join. Column(name="DOGGY_ID") public class Dog extends Animal{ @Column(name="BREED") private String breed; . . . }

Inheritance – JOINED create table Animal ( ID Number, TYPE varchar(255), AVG_WEIGHT Number );

Inheritance – JOINED create table Animal ( ID Number, TYPE varchar(255), AVG_WEIGHT Number ); create table Doggy ( DOGGY_ID Number, BREED varchar(255) );

Inheritance – TABLE_PER_CLASS create table Kitty ( ID Number, TYPE varchar(255), AVG_WEIGHT Number BREED

Inheritance – TABLE_PER_CLASS create table Kitty ( ID Number, TYPE varchar(255), AVG_WEIGHT Number BREED varchar(255), LIVES Number ); create table Doggy ( DOGGY_ID Number, TYPE varchar(255), AVG_WEIGHT Number BREED varchar(255) );

Interacting With Entity Bean Plain Java Objects

Interacting With Entity Bean Plain Java Objects

Entity Manager n Entities created as any plain Java object • Customer cust =

Entity Manager n Entities created as any plain Java object • Customer cust = new Customer(); Plain Java objects and homeless n Can be detached and reattached to container n • Can be serialized to remote client • Remote client can perform updates on local copy • Copy can be sent back to server and merged back in

Create the objects n n Create the entities like you would any other object

Create the objects n n Create the entities like you would any other object Allocate entire object graph like any other Java code Item item = new Item(); item. set. Description(“O’reilly’s EJB 3. 0 th 5 Edition”); item. set. Product. Name(“EJB 3. 0 Book”); … Owner bill = new Owner(); bill. set. Name(“Bill”); item. set. Owner(bill); Bid bid = new Bid(); … Hash. Set<Bid> bids = new Hash. Set(); bids. add(bid); item. set. Bids(bids);

Entity Manager n All entities persisted by the Entity. Manager service • All access

Entity Manager n All entities persisted by the Entity. Manager service • All access through this service • Creation, retrieval, removal, and merging • Analogous to Hibernate Session n Injected with dependency injection

Entity. Manager @Stateless public class Item. DAOImpl implements Item. DAORemote { @Persistence. Context(unit. Name=“Auction”)

Entity. Manager @Stateless public class Item. DAOImpl implements Item. DAORemote { @Persistence. Context(unit. Name=“Auction”) Inject the Entity. Manager service private Entity. Manager em; public long create(Item item) { em. persist(item); return item. get. Id(); } public Item find. By. Id(long id) { return em. find(Item. class, id); } public void merge(Item item) { em. merge(item); } }

Entity. Manager @Stateless public class Item. DAOImpl implements Item. DAORemote { @Persistence. Context(unit. Name=“Auction”)

Entity. Manager @Stateless public class Item. DAOImpl implements Item. DAORemote { @Persistence. Context(unit. Name=“Auction”) private Entity. Manager em; public long create(Item item) { em. persist(item); return item. get. Id(); } public Item find. By. Id(long id) { return em. find(Item. class, id); } public void merge(Item item) { em. merge(item); } } • Item allocated remotely • If cascade PERSIST, entire object graph inserted into storage

Entity. Manager @Stateless public class Item. DAOImpl implements Item. DAORemote { @Persistence. Context(unit. Name=“Auction”)

Entity. Manager @Stateless public class Item. DAOImpl implements Item. DAORemote { @Persistence. Context(unit. Name=“Auction”) private Entity. Manager em; public long create(Item item) { em. persist(item); return item. get. Id(); } public Item find. By. Id(long id) { return em. find(Item. class, id); } public void merge(Item item) { em. merge(item); } } • Item found with primary key • Detached from persistent storage at tx completion • Can be serialized like any other object

Entity. Manager @Stateless public class Item. DAOImpl implements Item. DAORemote { @Persistence. Context(unit. Name=“Auction”)

Entity. Manager @Stateless public class Item. DAOImpl implements Item. DAORemote { @Persistence. Context(unit. Name=“Auction”) private Entity. Manager em; public long create(Item item) { em. persist(item); return item. get. Id(); } public Item find. By. Id(long id) { return em. find(Item. class, id); } public void merge(Item item) { em. merge(item); } } • Item can be updated remotely and changes merged back to persistent storage • merge() returns a managed copy of Item

Query API n Queries may be expressed as EJBQL strings • Embedded in code

Query API n Queries may be expressed as EJBQL strings • Embedded in code • Externalized to metadata (named queries) Invoke via Query interface n @Stateless public class Item. DAOImpl { … • public Named parameter binding List find. By. Description(String description, int page) { return em. create. Query(“from Item i where i. description like : d ”) • Pagination control. set. Parameter(“d”, description). set. Max. Results(50). set. First. Result(page*50). get. Result. List(); } …

EJB QL 3. 0 EJBQL 3. 0 is very similar to HQL (Hibernate Query

EJB QL 3. 0 EJBQL 3. 0 is very similar to HQL (Hibernate Query Language) n Aggregation, projection n • select max(b. amount) from Bid b where b. item = : id • select new Name(c. first, c. last) from Customer c n Fetching • from Item i left join fetch i. bids n Subselects • from Item i join i. bids bid where bid. amount = (select max(b. amount)