Title: Configuring PersistenceUnits in Tests
<a name="ConfiguringPersistenceUnitsinTests-Overridingthepersistence.xml"></a>
# Overriding the persistence.xml

The most common situation in EJB related testing by far is the need to
alter your persistence.xml for a test environment.

<a name="ConfiguringPersistenceUnitsinTests-Overridingthe<jta-data-source>and<non-jta-data-source>"></a>
## Overriding the jta-data-source and non-jta-data-source

OpenEJB will automatically use the DataSources you have setup in your test
environment, we're pretty good at guessing the right DataSources you intend
even if the names don't match exactly -- or in some cases at all.  If there
is only one DataSource configured, it's very easy for us to guess the
DataSource to use.

This allows you to keep your persistence.xml configured for your production
environment and helps eliminate the need for a "test" persistence.xml
(though we do have that functionality).  A log line will be printed saying
if we had to adjust the DataSources of your persistence.xml.

<a name="ConfiguringPersistenceUnitsinTests-Overridingthepersistence-unit<properties>"></a>
##  Overriding the persistence-unit properties

You can override any property in your test setup via either system
properties or the initial context properties.  The format is:

`<unit-name>.<property>=<value>`

So for example with the following persistence.xml:

    <persistence>
      <persistence-unit name="movie-unit">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>movieDatabase</jta-data-source>
        <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source>
        <properties>
          <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
          <property name="hibernate.max_fetch_depth" value="3"/>
        </properties>
      </persistence-unit>
    </persistence>

    
You can override and add persistence unit properties in your test case.
There are currently no facilities for removing them (if you have a need for
that let us know -- it hasn't really come up so far).

    Properties p = new Properties();
    p.put(Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.client.LocalInitialContextFactory");

    p.put("movie-unit.hibernate.hbm2ddl.auto", "update");
    p.put("movie-unit.hibernate.dialect", "org.hibernate.dialect.HSQLDialect");

    context = new InitialContext(p);

The overriding order is as follows: 1 = highest, 4 = lowest.
    
1. InitialContext properties
1. jndi.properties from the classpath
1. System properties
1. persistence.xml properties
     
By default there are no overrides in 1-3, so #4 is the only source of
information.  
    
In the above example there would be exactly three properties for the "movie-unit" persistence unit:

  - hibernate.hbm2ddl.auto = update
  - hibernate.max_fetch_depth = 3
  - hibernate.dialect = org.hibernate.dialect.HSQLDialect
    
These properties would be passed by OpenEJB directly to the persistence
provider (in this case Hibernate).  With one exception OpenEJB does not
understand or modify these properties.	Details on that one exception
below.

### Common mistakes

Note that you **must** use the **unit name** as the prefix.  This will not work:

        Properties p = new Properties();
        p.put(Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.client.LocalInitialContextFactory");

        p.put("hibernate.hbm2ddl.auto", "update");
        p.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");

        context = new InitialContext(p);

Currently, only properties that start with the unit name are search and applied.

###  No need to specify a "transaction lookup" property

All vendors have such a property for getting a reference to the container's
TransactionManager and nothing works if this is not set correctly to the
OpenEJB specific class.  To make the lives of users easier, OpenEJB will
take the liberty of setting it for you.

Here are the persistence provider classes we understand and the defaults we
will set for you:

#### Provider org.hibernate.ejb.HibernatePersistence

When using this provider, the *hibernate.transaction.manager_lookup_class*
will be automatically set by OpenEJB to
_org.apache.openejb.hibernate.TransactionManagerLookup_.  If the property
is already set in the persistence unit it will be overwritten if it starts
with the standard "org.hibernate.transaction." prefix.	

Custom lookup implementations will never be overwritten automatically.

#### Provider oracle.toplink.essentials.PersistenceProvider

Or _oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider_.

When using this provider, the *toplink.target-server* will be automatically
set by OpenEJB to _org.apache.openejb.toplink.JTATransactionController_. 
If the property is already set in the persistence unit it will be
overwritten if it starts with the standard "oracle.toplink.transaction."
prefix.  

Custom transaction controller implementations will never be overwritten automatically.

#### Provider org.eclipse.persistence.jpa.PersistenceProvider

Or _org.eclipse.persistence.jpa.osgi.PersistenceProvider_.

When using this provider, the *eclipselink.target-server* will be
automatically set by OpenEJB to
_org.apache.openejb.eclipselink.JTATransactionController_.  If the property
is already set in the persistence unit it will be overwritten if it starts
with the standard "org.eclipse.persistence.transaction." prefix.  

Custom transaction controller implementations will never be overwritten automatically.

#### Provider org.apache.openjpa.persistence.PersistenceProviderImpl

OpenJPA is capable of discovering the correct method for locating the
TransactionManager without the need for users to specify the specific
strategy.  Therefore no specific "magic" is required.

