Arrghh... plain stupidity from my side: addressing the persistence unit instead
of the data source does the trick!
Sorry for bothering you with this!
>
>Hi,
>
>I celebrated too early. Using David's approach I came up with
>the following properties for the initial context:
> p.put("exampleDatabase.hibernate.hbm2ddl.auto", "update");
> p.put("exampleDatabase.hibernate.dialect",
>"org.hibernate.dialect.HSQLDialect");
>
>Unfortunately, the settings are ignored and I get a warning
>message that says exactly this:
> WARN - Property "hibernate.dialect" not supported by
>"exampleDatabase"
> WARN - Property "hibernate.hbm2ddl.auto" not supported by
>"exampleDatabase"
>
>@David: Do you have an idea what went wrong here?
>
>@Jean-Louis: I didn't try your approach, because I fear it
>clutters my pom.xml. Or how do you do the profile switching?
>(I'd like to run through the normal compile-test-install
>lifecycle of Maven without having to explicitly selecting the
>profile through the -P argument, so the properties should be
>determined by looking at the lifecycle phase only)
>
>Regards Adrian
>
>>-----Ursprüngliche Nachricht-----
>>Von: David Blevins [mailto:[email protected]]
>>Gesendet: Mittwoch, 19. August 2009 00:03
>>An: [email protected]
>>Betreff: Re: AW: Multiple Persistence Units
>>
>>I second Jean-Louis' recommendation to use just one unit.
>>
>>One additional approach is that nearly all aspects of the
>>persistence- unit can be overridden by OpenEJB.
>>
>>
>>1. The <jta-data-source> and <non-jta-data-source>
>>
>>We will automatically use the datasources you have setup in your test
>>environment, we're pretty good at guessing the right datasources you
>>intend. A log line will be printed saying if we had to adjust your
>>persistence.xml.
>>
>>2. The 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:
>>
>> Properties p = new Properties();
>>
>>p
>>.put
>>(Context
>>.INITIAL_CONTEXT_FACTORY
>>,"org.apache.openejb.client.LocalInitialContextFactory");
>>
>> p.put("exampleDatabase", "new://Resource?type=DataSource");
>> p.put("exampleDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");
>> p.put("exampleDatabase.JdbcUrl", "jdbc:hsqldb:mem:exampledb");
>> // Note, if you don't configure an unmanaged datasource, we
>>will
>> // automatically create one for you based on the above
>>datasource.
>>
>> // here we're setting an persistence unit property
>> p.put("myUnit.hibernate.hbm2ddl.auto", "update");
>>
>> context = new InitialContext(p);
>>
>>3. Special note on "hibernate.transaction.manager_lookup_class"
>>
>>Nothing works if this is not set correctly to the OpenEJB specific
>>class, so we take the liberty of setting it for you. There's no need
>>to set it yourself.
>>
>>
>>An note on the altdd support: we actually added this only
>recently on
>>purpose after a bit of hesitation. Reason being is that the most
>>common cases of wanting things to be "different" are taken care of
>>automatically. The boring "need to use a different" database
>kind of
>>needs are covered. It's really only when you are trying to do
>>something really complicated that you need to break into the altdd
>>support.
>>
>>Think we need to update the altdd page with a big disclaimer that
>>there is an easier way to do persistence unit configuration.
>>
>>-David
>>
>>On Aug 18, 2009, at 1:06 PM, Jean-Louis MONTEIRO wrote:
>>
>>>
>>> Hi Adrian,
>>>
>>> Using two persistence units seems not appropriated. Moreover,
>>> defining those
>>> persistence units in two different persistence.xml files can be
>>> error prone.
>>>
>>> Regarding maven, src/main/java + src/main/resources will go to
>>> target/classes so it will be deployed as an ejb module.
>>> src/test/java + src/test/resources will go two a different module in
>>> target/test-classes
>>>
>>> I can see two solutions to solve your problem (from my
>>understanding).
>>>
>>> For both, i recommend not to use two persistence units. You only
>>> need one
>>> persistence unit, but you need to change the data source for tests,
>>> production, ...
>>>
>>> 1. the first is using maven: you can define a persistence.xml
>>> (src/main/filters) with strings you can dynamically change using
>>> filters.
>>> for example: <jta-data-source>@target.datasource@</jta-data-source>
>>>
>>> Then, you just need to create two profiles:
>>> - test (for example) activated by default used to change the
>>> datasource to
>>> the test one.
>>> - production (for example) used during packaging/deply
>phase or any
>>> other by
>>> using the -P switch.
>>>
>>> Everything is well described in the maven definitive user guide.
>>>
>>> 2. using alternate deployment descriptors
>>> You can use 2 persistence.xml file defining the same persistence
>>> unit (one
>>> for test and the other for production). Then, you just have
>>to set the
>>> system property (altdd) to switch from one to the other.
>>>
>>> Hope it helps.
>>> Jean-Louis
>>>
>>>
>>>
>>>
>>> burriad wrote:
>>>>
>>>> <Second try, full problem description this time around...>
>>>> Hi,
>>>>
>>>> I'm facing the following issue: I have to DB instances, one for
>>>> testing
>>>> (an in-memory HSQLDB database) and one for production (will be
>>>> MySQL ,
>>>> for now I use exactly the same DB). To make the switch
>between the
>>>> two,
>>>> I came up with the following setup:
>>>>
>>>> 1. Maven project, with OpenEJB registered for testing (I won't show
>>>> the pom here)
>>>> 2. One persistence.xml with two persistence units (I tried to put
>>>> one persistence.xml in /src/test/resources, but it didn't got
>>>> recognized
>>>> during testing) .
>>>> <persistence-unit name="ejb-example-openejb">
>>>> <provider>org.hibernate.ejb.HibernatePersistence</provider>
>>>> <jta-data-source>exampleDatabase</jta-data-source>
>>>>
>>>> <non-jta-data-source>exampleDatabaseUnmanaged</non-jta-data-source>
>>>> <properties>
>>>> <property name="hibernate.hbm2ddl.auto" value="update"/>
>>>> <property
>>>> name="hibernate.transaction.manager_lookup_class"
>>>>
>>>> value="org.apache.openejb.hibernate.TransactionManagerLookup"/>
>>>> </properties>
>>>> </persistence-unit>
>>>> <persistence-unit name="ejb-example-openejb-testing">
>>>> <provider>org.hibernate.ejb.HibernatePersistence</provider>
>>>> <jta-data-source>exampleDatabase</jta-data-source>
>>>>
>>>> <non-jta-data-source>exampleDatabaseUnmanaged</non-jta-data-source>
>>>> <properties>
>>>> <property name="hibernate.hbm2ddl.auto" value="update"/>
>>>> <property
>>>> name="hibernate.transaction.manager_lookup_class"
>>>>
>>>> value="org.apache.openejb.hibernate.TransactionManagerLookup"/>
>>>> </properties>
>>>> </persistence-unit>
>>>> 3. A test case setup with the altdd-Option activated:
>>>> p.put(Context.INITIAL_CONTEXT_FACTORY,
>>>> "org.apache.openejb.client.LocalInitialContextFactory");
>>>>
>>>> p.put("openejb.altdd.prefix", "test");
>>>>
>>>> p.put("exampleDatabase", "new://Resource?type=DataSource");
>>>> p.put("exampleDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");
>>>> p.put("exampleDatabase.JdbcUrl", "jdbc:hsqldb:mem:exampledb");
>>>> p.put("exampleDatabaseUnmanaged",
>>>> "new://Resource?type=DataSource");
>>>> p.put("exampleDatabaseUnmanaged.JdbcDriver",
>>>> "org.hsqldb.jdbcDriver");
>>>> p.put("exampleDatabaseUnmanaged.JdbcUrl",
>>>> "jdbc:hsqldb:mem:exampledb");
>>>> p.put("exampleDatabaseUnmanaged.JtaManaged", "false");
>>>>
>>>> context = new InitialContext(p);
>>>> 4. An ejb-jar.xml and a test.ejb-jar.xml that look almost the same,
>>>> besides pointing to a different persistence unit (only test.ejb-
>>>> jar.xml
>>>> shown here):
>>>> <ejb-jar>
>>>> <enterprise-beans>
>>>> <session>
>>>> <ejb-name>SessionFacadeImpl</ejb-name>
>>>> <persistence-context-ref>
>>>>
>>>> <persistence-context-ref-name>persistenceContext</persistence-
>>>> context-re
>>>> f-name>
>>>>
>>>> <persistence-unit-name>ejb-example-openejb-testing</persistence-
>>>> unit-nam
>>>> e>
>>>> </persistence-context-ref>
>>>> </session>
>>>> </enterprise-beans>
>>>> </ejb-jar>
>>>> 5. As you might have guessed, my stateless session bean looks like
>>>> follows:
>>>> @Stateless
>>>> public class SessionFacadeImpl implements SessionFacadeLocal {
>>>> @PersistenceContext(name="persistenceContext")
>>>> private EntityManager em;
>>>>
>>>> ...
>>>> }
>>>>
>>>> Now I get an error when I run the tests. The error message
>>looks like
>>>> follows:
>>>> ERROR - FAIL ... null: The persistence unit "" does not exist.
>>>> Update
>>>> the "persistenceContext" PersistenceContext ref to one of the
>>>> available
>>>> units [ejb-example-openejb-testing, ejb-example-openejb] or
>>declare
>>>> the
>>>> unit in a persistence.xml like the following:<persistence
>>>> xmlns="http://java.sun.com/xml/ns/persistence"
>>>> version="1.0"><persistence-unit
>>>> name=""><jta-data-source>java:openejb/Resource/myDataSource</jta-
>>>> data-so
>>>> urce><non-jta-data-source>java:openejb/Resource/
>>>> myUnmanagedDataSource</n
>>>> on-jta-data-source><properties><property
>>>> name="openjpa.jdbc.SynchronizeMappings"
>>>> value="buildSchema(ForeignKeys=true)"/></properties></persistence-
>>>> unit><
>>>> /persistence>
>>>>
>>>> If I do as I am told an add this empty persistence unit, I
>>will get
>>>> an
>>>> error like this:
>>>> ERROR - FAIL ... null: The reference
>>>> @PersistenceContext(name="persistenceContext", unitName="")
>>cannot be
>>>> resolved as there are 3 units with the same name. Update your
>>>> unitName
>>>> to one of the following: 390766514
>>>> SeminarEntityManager 390766514
>>>> ejb-example-openejb 390766514
>>>>
>>>> So, what is wrong here? Is the configuration wrong, or is it a
>>>> problem
>>>> with OpenEJB? Or am I down the wrong path with my setup and
>>there's
>>>> an
>>>> easier way to have a separate DB instance for testing.
>>>>
>>>> Any help would be appreciated. I could narrow the problem to the
>>>> point
>>>> that I could see that putting a second persistence unit into
>>>> persistence.xml caused the problem, so the ejb-jar.xml
>>>> configuration on
>>>> a single persistence unit works as outlined.
>>>> Adrian Burri
>>>> Software Engineering
>>>>
>>>>
>>>>
>>>>
>>>
>>> --
>>> View this message in context:
>>http://www.nabble.com/Multiple-Persistence-Units-tp25027340p250
>>32565.html
>>> Sent from the OpenEJB User mailing list archive at Nabble.com.
>>>
>>>
>>
>>
>