4. Tutorial Using the Java Persistence API (JPA)

This tutorial is located within the download bundle under entitymanager/.

Objectives

  • Bootstrap a JPA EntityManagerFactory

  • Use annotations to provide mapping information

  • Use JPA API calls

4.1. persistence.xml

The previous tutorials used the Hibernate-specific hibernate.cfg.xml configuration file. JPA, however, defines a different bootstrap process that uses its own configuration file named persistence.xml. This bootstrapping process is defined by the JPA specification. In Java™ SE environments the persistence provider (Hibernate in this case) is required to locate all JPA configuration files by classpath lookup of the META-INF/persistence.xml resource name.

Example 10. persistence.xml

  1. <persistence xmlns="http://java.sun.com/xml/ns/persistence"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
  4. version="2.0">
  5. <persistence-unit name="org.hibernate.tutorial.jpa">
  6. ...
  7. </persistence-unit>
  8. </persistence>

persistence.xml files should provide a unique name for each “persistence unit”. Applications use this name to reference the configuration when obtaining an javax.persistence.EntityManagerFactory reference.

The settings defined in the <properties/> element are discussed in The Hibernate configuration file. Here the javax.persistence-prefixed varieties are used when possible. Notice that the remaining Hibernate-specific configuration setting names are now prefixed with hibernate..

Additionally, the <class/> element functions the same as we saw in The Hibernate configuration file.

4.2. The annotated entity Java class

The entity is exactly the same as in The annotated entity Java class.

4.3. Example code

The previous tutorials used the Hibernate native APIs. This tutorial uses the JPA APIs.

Example 11. Obtaining the javax.persistence.EntityManagerFactory

  1. protected void setUp() throws Exception {
  2. sessionFactory = Persistence.createEntityManagerFactory( "org.hibernate.tutorial.jpa" );
  3. }

Notice again that the persistence unit name is org.hibernate.tutorial.jpa, which matches persistence.xml.

Example 12. Saving (persisting) entities

  1. EntityManager entityManager = sessionFactory.createEntityManager();
  2. entityManager.getTransaction().begin();
  3. entityManager.persist( new Event( "Our very first event!", new Date() ) );
  4. entityManager.persist( new Event( "A follow up event", new Date() ) );
  5. entityManager.getTransaction().commit();
  6. entityManager.close();

The code is similar to Saving entities. The javax.persistence.EntityManager interface is used instead of the org.hibernate.Session interface. JPA calls this operation “persist” instead of “save”.

Example 13. Obtaining a list of entities

  1. entityManager = sessionFactory.createEntityManager();
  2. entityManager.getTransaction().begin();
  3. List<Event> result = entityManager.createQuery( "from Event", Event.class ).getResultList();
  4. for ( Event event : result ) {
  5. System.out.println( "Event (" + event.getDate() + ") : " + event.getTitle() );
  6. }
  7. entityManager.getTransaction().commit();
  8. entityManager.close();

Again, the code is pretty similar to what we saw in Obtaining a list of entities.

4.4. Take it further!

Practice Exercises

  • Develop an EJB Session bean to investigate implications of using a container-managed persistence context. Try both stateless and stateful use-cases.

  • Use listeners with CDI-based injection to develop a JMS-based event message hub