You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomee.apache.org by "Burri Adrian (Helbling Technik)" <ad...@helbling.ch> on 2009/08/18 17:23:06 UTC

Multiple Persistence Units

Hi,
 
I'm facing the following issue: I have to DB instances, one for testing
(an in-memory HSQLDB database) and one for production (MySQL). 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)
	

 
Adrian Burri
Software Engineering 

 

AW: AW: Multiple Persistence Units

Posted by "Burri Adrian (Helbling Technik)" <ad...@helbling.ch>.
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:david.blevins@visi.com]
>>Gesendet: Mittwoch, 19. August 2009 00:03
>>An: users@openejb.apache.org
>>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.
>>>
>>>
>>
>>
>

AW: AW: Multiple Persistence Units

Posted by "Burri Adrian (Helbling Technik)" <ad...@helbling.ch>.
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:david.blevins@visi.com] 
>Gesendet: Mittwoch, 19. August 2009 00:03
>An: users@openejb.apache.org
>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.
>>
>>
>
>

Re: AW: AW: Multiple Persistence Units

Posted by Jean-Louis MONTEIRO <je...@atosorigin.com>.


burriad wrote:
> 
> In the initial context, I put the following line to get rid of the MySQL
> dialect:
>         p.put("exampleDatabase.hibernate.dialect",
> "org.hibernate.dialect.HSQLDialect");
> 
> If I don't do that, is the value from persistence.xml taken, or can I
> get rid of this property for the initial context as well?
> 
> (The question's probably stupid... I assume that the line
>         p.put("exampleDatabase", "new://Resource?type=DataSource");
> creates a new data source with all default parameters anyway, ignoring
> the persistence.xml altogether... but what are the Hibernate default
> parameters... I don't think that I fully understood what's going on
> behind the scene...)
> 
Hi, 

I think you no more need this property.
AFAIK, when connecting to the database, Hibernate gets database metadata in
order to set properly the dialect. If not possible, it fires an exception.

So with some databases, you need to add the dialect as a property in the
persistence.xml (and make it dynamic if needed).

Hope it helps.
Jean-Louis
-- 
View this message in context: http://www.nabble.com/Multiple-Persistence-Units-tp25027340p25045834.html
Sent from the OpenEJB User mailing list archive at Nabble.com.


AW: AW: Multiple Persistence Units

Posted by "Burri Adrian (Helbling Technik)" <ad...@helbling.ch>.
Hi guys, thanks for your help, I'm implementing your recommendations and
all seems to work fine.

Just one point: do I understand you correctly that I have to override
explicitly the properties set in persistence.xml, the other ones just
get the defaults as specified in the documentation.

As an example, my persistence.xml looks like this:
	<persistence-unit name="SeminarEntityManager"
transaction-type="JTA">
	
<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<jta-data-source>java:/courseAppDS</jta-data-source>
		<properties>
			<property name="hibernate.dialect"
value="org.hibernate.dialect.MySQLDialect"/>
			<property name="hibernate.hbm2ddl.auto"
value="update" />
		</properties>
	</persistence-unit>
In the initial context, I put the following line to get rid of the MySQL
dialect:
        p.put("exampleDatabase.hibernate.dialect",
"org.hibernate.dialect.HSQLDialect");

If I don't do that, is the value from persistence.xml taken, or can I
get rid of this property for the initial context as well?

(The question's probably stupid... I assume that the line
        p.put("exampleDatabase", "new://Resource?type=DataSource");
creates a new data source with all default parameters anyway, ignoring
the persistence.xml altogether... but what are the Hibernate default
parameters... I don't think that I fully understood what's going on
behind the scene...)


>
>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.
>>
>>
>
>

Re: AW: Multiple Persistence Units

Posted by David Blevins <da...@visi.com>.
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-tp25027340p25032565.html
> Sent from the OpenEJB User mailing list archive at Nabble.com.
>
>


Re: AW: Multiple Persistence Units

Posted by Jean-Louis MONTEIRO <je...@atosorigin.com>.
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-tp25027340p25032565.html
Sent from the OpenEJB User mailing list archive at Nabble.com.