JPA : Entity Manager Factory

Any JPA-enabled application will require at least one EntityManagerFactory. Typically applications create one per datastore being utilised. An EntityManagerFactory provides access to EntityManagers which allow objects to be persisted, and retrieved. The EntityManagerFactory can be configured to provide particular behaviour.

The simplest way of creating an EntityManagerFactory in a JavaSE environment is as follows

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;


EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnitName);

So you simply provide the name of the persistence-unit which defines the properties, classes, metadata etc to be used. An alternative is to specify the properties to use along with the persistence-unit name. In that case the passed properties will override any that are specified for the persistence unit itself.

An EntityManagerFactory is designed to be thread-safe. An EntityManager is not

Specifying the datastore properties

With JPA you have 2 ways of specifying the datastore via persistence properties

  • Specify the connection URL/driverName/userName/password and it will internally create a DataSource for this URL (with optional connection pooling). This is achieved by specifying javax.persistence.jdbc.url, javax.persistence.jdbc.driver, javax.persistence.jdbc.user, and javax.persistence.jdbc.password
  • Specify the JNDI name of the connectionFactory This is achieved by specifying javax.persistence.jtaDataSource, and javax.persistence.nonJtaDataSource (for secondary operations)

Standard JPA Properties

Parameter Values Description
javax.persistence.provider Class name of the provider to use. DataNucleus has a provider name of org.datanucleus.api.jpa.PersistenceProviderImpl If you only have 1 persistence provider in the CLASSPATH then this doesn't need specifying.
javax.persistence.transactionType RESOURCE_LOCAL | JTA Type of transactions to use. In Java SE the default is RESOURCE_LOCAL. In Java EE the default is JTA. Note that if using a JTA datasource as the primary connection, you ought to provide a non-jta-data-source also since any schema generation and/or sequence handling will need to use that.
javax.persistence.jtaDataSource JNDI name of a (transactional) JTA data source. Note that if using a JTA datasource as the primary connection, you ought to provide a non-jta-data-source also since any schema generation and/or sequence handling will need to use that.
javax.persistence.nonJtaDataSource JNDI name of a (non-transactional) data source.
javax.persistence.jdbc.driver Alias for datanucleus.ConnectionDriverName
javax.persistence.jdbc.url Alias for datanucleus.ConnectionURL
javax.persistence.jdbc.user Alias for datanucleus.ConnectionUserName
javax.persistence.jdbc.password Alias for datanucleus.ConnectionPassword
javax.persistence.query.timeout Alias for datanucleus.query.timeout
javax.persistence.sharedCache.mode Alias for datanucleus.cache.level2.mode
javax.persistence.validation.mode Alias for datanucleus.validation.mode Alias for Alias for Alias for
javax.persistence.validation.factory Alias for datanucleus.validation.factory
javax.persistence.schema-generation.database.action create | drop | drop-and-create | none Alias for datanucleus.generateSchema.database.mode
javax.persistence.schema-generation.scripts.action create | drop | drop-and-create | none Alias for datanucleus.generateSchema.scripts.mode
javax.persistence.schema-generation.scripts.create-target {filename} Alias for
javax.persistence.schema-generation.scripts.drop-target {filename} Alias for

Extension DataNucleus Properties

DataNucleus provides many properties to extend the control that JPA gives you. These can be used alongside the above standard JPA properties, but will only work with DataNucleus. Please consult the Persistence Properties Guide for full details. In addition we have the following properties explicitly for JPA.

Description When running with JPA in a JavaEE environment if you wish to have your classes enhanced at runtime you can enable this by setting this property to true. The default is to bytecode enhance your classes before deployment.
Range of Values false | true

Description JPA defines two lifecycle options. JavaEE usage defaults to "transaction" where objects are detached when a transaction is committed. JavaSE usage defaults to "extended" where objects are detached when the EntityManager is closed. This property allows control
Range of Values transaction | extended

Description JPA requires that any persistence exception should mark the current transaction for rollback. This persistence property allows that inflexible behaviour to be turned off leaving it to the user to decide when a transaction is needing to be rolled back.
Range of Values true | false

Description JPA requires that any implementation throws an exception from EM.find if the key argument is not of the exact type required for the field. Having this property set to true means that DataNucleus can attempt to perform type conversion to attempt to make it match. This is useful, for example, where you PK type is something like Long and you pass a long or int in.
Range of Values true | false