Transcript JPA

Overview
• Earlier versions of EJB Specification
defined the persistence layer
– javax.ejb.EntityBean
• Java EE 5 moved persistence to its own
specification
– Java Persistence API (JPA) version 1.0
– javax.persistence
• ease of use API above JDBC
• Provides
– Object/Relational Mapping (ORM) Engine
– Query Language (SQL-Like, based on former EJB-QL)
Java Persistence:
•v110912
Java EE 6 uses
JPAEntityManager
2.0
2
javax.persistence.EntityManag
er
• Replaces much of the EJB 2.x “Home”
functionality
• Handles O/R Mapping of Entities to the
database
• Provides APIs
– inserting objects into database
– getting objects from database
– synchronizing objects with database
– querying database
• Provides caching
• Coordinates with transactional services
v110912
Java Persistence: EntityManager
(JTA)
3
javax.persistence.EntityManag
er
• Replaces much of the EJB 2.x “Home”
functionality
• Handles O/R Mapping of Entities to the
database
• Provides APIs
– inserting objects into database
– getting objects from database
– synchronizing objects with database
– querying database
• Provides caching
• Coordinates with transactional services
v110912
Java Persistence: EntityManager
(JTA)
4
Entities
• (formerly and sometimes still called
Entity Beans)
• are now Plain Old Java Objects (POJOs)
– nothing special happens when calling new
Author author = new Author();
• are not persistent until associated with an
EntityManager
em.persist(author);
v110912
Java Persistence: EntityManager
5
Example Author POJO Entity
@javax.persistence.Entity
public class Author {
private long id;
private long version=0;
private String firstName;
private String lastName;
private String subject;
private Date publishDate;
Warning: Using GeneratedValue
without specifying a specific strategy
should only be used when you have
no intention of controlling how the
provider manages primary keys for
this object type. This would be rare.
public Author() {}
public Author(long id) { this.id = id; }
...
}
v110912
@Id @GeneratedValue
public long getId() { return id;}
private void setId(long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
Java Persistence: EntityManager
6
Creating Entity in Database
Author author = new Author(); //primary key will be gen
author.setFirstName("dr");
author.setLastName("seuss");
author.setSubject("children");
author.setPublishDate(new Date());
log_.info("creating author:" + author);
em.persist(author);
log_.info("created author:" + author);
//output
-creating author:id=0, fn=dr,
pdate=Fri Sep 15 11:54:15 EDT
-created author:id=50, fn=dr,
pdate=Fri Sep 15 11:54:15 EDT
v110912
ln=seuss, subject=children,
2006
ln=seuss, subject=children,
2006
Java Persistence: EntityManager
7
Managed and Unmanaged
Entities
• Unmanaged state (detached)
– instance not associated with an
EntityManager
– state changes are not tracked
– can be serialized to client and returned to be
synchronized with database
– nothing equivalent to this state in EJB 2.1
entity beans
• Managed state (attached)
– instance associated with an EntityManager
– state changes are tracked within a
Persistence Context
v110912
Java Persistence: EntityManager
– EJB 2.1 entity
beans were always managed8
Persistence Context
• A set of attached entity instances
managed by an EntityManager
• All entities become detached once
closed
• Two types
– Transaction-scoped Persistence Contexts
• begin/end at transaction boundaries
• only made available through container managed
persistence contexts
– Extended Persistence Contexts
v110912
• live beyond any single transaction
• allow longer-lived interactions with database
Java Persistence:
EntityManagertying up database
without lengthy
transactions
resources
9
Persistence Context Examples
• Transaction-scoped (inside server container)
@PersistenceContext(unitName=”jpaDemo”)
EntityManager em;
@TransactionAttribute(REQUIRED)
public void update(long authorId, String type) {
Author author = em.find(Author.class, authorId);
author.setType(type);
}
• Extended (inside or outside server container)
EntityManager em = Persistence.
createEntityManagerFactory(“jpaDemo”).createEntityManager
();
tx.begin();
//tx 1 begins
Author author = em.find(Author.class, authorId);
tx.commit();
//tx 1 ends, but author remains managed
...
tx.begin();
//tx 2 begins
author.setType(type);
v110912
Java2Persistence:
tx.commit();
//tx
ends, EntityManager
and author is still managed 10
until close
Persistence Unit
• A set of classes that are mapped to the
database
• defined in META-INF/persistence.xml
• must have an identity
– “” is a valid identity
• Classes
– may be named in persistence.xml file
– may be automatically scanned for in the
classpath
• orm.xml
– optionally provided to augment, provide, or
v110912 replace classJava
Persistence: EntityManager
11
persistence
metadata
Example Component Layout
META-INF/
+---persistence.xml
ejava
+ ---examples
+---…
+---DAOException.class
+---AuthorDAO.class
+---jpa
|
+---JPAAuthorDAO.class
|
+---JPADAOBase.class
+--domain
+---Author.class
v110912
Java Persistence: EntityManager
12
Example persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="jpaDemo">
referenced by name
• global JNDI name by which
provider references resource
(will be used when deployed within server)
• may use properties element in Java SE
environments that lack JNDI
<jta-data-source>java:/ejavaDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.show_sql" value="true"/
</properties>
</persistence-unit>
</persistence>
v110912
• vendor-specific way to configure
persistence provider
Java Persistence: EntityManager
13
Another Example
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="jpaDemo">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.cache.provider_class"
value="net.sf.ehcache.hibernate.Provider"/>
<property name="hibernate.dialect"
value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.connection.url"
value="jdbc:hsqldb:hsql://localhost:9001"/>
<property name="hibernate.connection.driver_class"
value="org.hsqldb.jdbcDriver"/>
<property name="hibernate.connection.password"
value=""/>
<property name="hibernate.connection.username"
value="sa"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
</properties>
</persistence-unit>
</persistence
v110912
Java Persistence: EntityManager
14
persistence.xml elements
•
•
name – identity to reference Persistence Unit
provider – fully qualified name of javax.persistence.PersistenceProvider
– not needed if provider found in classpath acceptable
• mapping-file – resource path to optional mapping file
– can be used to specify <class>es or specify/override @Annotation
details
• jta-data-source
– vendor-specific reference to data source using JTA transactions
• non-jta-data-source
– vendor-specific reference to data source using RESOURCE_LOCAL
transactions
• jar-file
– optional/additional jar file to scan for classes
• class
– specifies entity classes not automatically scanned by provider
• exclude-unlisted-classes
– if set, provider will not automatically scan archive for entity classes
• v110912
properties
Java Persistence: EntityManager
15
– may be used to provide vendor-specific properties to configure
Java SE Steps
• Startup
– Get EntityManagerFactory
• Runtime
– Create EntityManager
– Start Transaction
– Interact with Entity Manager
– Commit Transaction
– Close EntityManager
• Shutdown
– Close EntityManagerFactory
v110912
Java Persistence: EntityManager
16
updating entities
• Updates to managed entities
automatically get propagated to database
according to flush policy
public Author update(Author author) {
Author dbAuthor =
em.find(Author.class,author.getId());
dbAuthor.setFirstName(author.getFirstName());
dbAuthor.setLastName(author.getLastName());
dbAuthor.setSubject(author.getSubject());
dbAuthor.setPublishDate(author.getPublishDate());
return dbAuthor;
}
– Note that if author passed in was already managed...
v110912
• the changes have already been queued
• the dbAuthor returned from the find() will be the same object as author
Java Persistence:
EntityManager
• the sets are unnecessarily
changing
the values of the Author to their 17
current values
(optional!)Potential Utiltity
Class
package ejava.examples.dao.jpa;
import
import
import
import
java.util.HashMap;
java.util.Map;
javax.persistence.EntityManagerFactory;
javax.persistence.Persistence;
public class JPAUtil {
private static final Map<String, EntityManagerFactory> factories =
new HashMap<String, EntityManagerFactory>();
public static EntityManagerFactory getEntityManagerFactory(String puName) {
EntityManagerFactory emf = factories.get(puName);
if (emf == null) {
synchronized(factories) {
emf = factories.get(puName);
if (emf == null) {
emf = Persistence.createEntityManagerFactory(puName);
factories.put(puName, emf);
}
}
}
return emf;
}
public static void close() {
synchronized(factories) {
for(String puName : factories.keySet()) {
factories.get(puName).close();
}
factories.clear();
}
}
}
v110912
Java Persistence: EntityManager
18