Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
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