Great, I guess we were too smart by half :)

When you are happy with what you have would you be willing to summarise your 
experience? I can then use it to add more doc to the website. 

Thanks
Alasdair

On 18 Sep 2010, at 10:43, Bengt Rodehav <[email protected]> wrote:

> Solved it myself. Looked at the activator and realised it's all taken care of 
> automatically - very slick!
> 
> Thanks,
> 
> /Bengt
> 
> 2010/9/18 Bengt Rodehav <[email protected]>
> Alasdair,
> 
> Thanks for the tip. I tried this:
> 
> 
>   <bean id="refdataXADataSourceWrapper" 
> class="org.apache.aries.transaction.jdbc.XADatasourceEnlistingWrapper">
>     <property name="dataSource" ref="refdataXADataSource" />
>   </bean>
> 
>   <service ref="refdataXADataSourceWrapper" interface="javax.sql.DataSource">
>     <service-properties>
>       <entry key="osgi.jndi.service.name" value="jdbc/refdatajta" />
>     </service-properties>
>   </service>
> 
> But it seems like the org.apache.aries.transaction.jdbc package is not 
> exported. Obviously I'm doing it the wrong way. Do you have a sample?
> 
> Thanks,
> 
> /Bengt
> 2010/9/18 Alasdair Nottingham <[email protected]>
> 
> Hi,
> 
> Since you are using an XA DataSource you need a some transaction support. 
> I'll assume you have a JTA service implementation, but if you grab the 
> transaction/transaction-wrappers project it will adapt your XADataSource into 
> a DataSource.
> 
> You'll need to change the lookup back to DataSource.
> 
> Alasdair Nottingham
> 
> On 18 Sep 2010, at 08:41, Bengt Rodehav <[email protected]> wrote:
> 
>> Thanks a lot Valentin!
>> 
>> You were right about those 2 issues. I now got further but not all the way. 
>> The first time I use an entity manager:
>> 
>> mEntityManager.persist(theAccount)
>> 
>> I get the following exception:
>> 
>> Caused by: java.lang.ClassCastException: 
>> $javax.sql.XADataSource$$EnhancerByCGLIB$$755fe697 cannot be cast to 
>> javax.sql.DataSource
>>      at 
>> org.apache.aries.jpa.container.unit.impl.DelayedLookupDataSource.getDs(DelayedLookupDataSource.java:43)
>>      at 
>> org.apache.aries.jpa.container.unit.impl.DelayedLookupDataSource.getConnection(DelayedLookupDataSource.java:60)
>>      at 
>> org.apache.openjpa.lib.jdbc.DelegatingDataSource.getConnection(DelegatingDataSource.java:137)
>>      at 
>> org.apache.openjpa.lib.jdbc.DecoratingDataSource.getConnection(DecoratingDataSource.java:112)
>>      at 
>> org.apache.openjpa.jdbc.schema.DataSourceFactory.installDBDictionary(DataSourceFactory.java:239)
>>      ... 51 more
>> 
>> Seems like OpenJPA wants a javax.sql.DataSource but is given something else. 
>> The entity manager is injected using Blueprint as follows:
>> 
>> <?xml version="1.0" encoding="UTF-8"?>
>> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"; 
>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>>   xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0"; 
>> xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0";
>>   xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.0.0";>
>> 
>>   <bean id="accountServiceImpl" 
>> class="se.digia.sts.refdata.impl.AccountServiceImpl">
>>     <tx:transaction method="*" value="Required" />
>>     <jpa:context property="entityManager" unitname="refdataPU" />
>>   </bean>
>> 
>>   <service ref="accountServiceImpl" 
>> interface="se.digia.sts.refdata.api.IAccountService">
>>   </service>
>> </blueprint>
>> 
>> Any thoughts?
>> 
>> /Bengt
>> 
>> 
>> 2010/9/18 Valentin Mahrwald <[email protected]>
>> Hi Bengt,
>> 
>> the error you see in my experience is almost always due to the 
>> jta-data-source not being found, OpenJPA then goes on to try creating a data 
>> source from the properties (in the persistence.xml not the ones in 
>> blueprint) where you have nothing specified.
>> 
>> In your persistence xml I think where you have:
>>> <jta-data-source>osgi:services/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/refdatajta)</jta-data-source>
>> it should be
>>> <jta-data-source>osgi:service/javax.sql.XADataSource/(osgi.jndi.service.name=jdbc/refdatajta)</jta-data-source>
>> 
>> Two things there:
>> - the url namespace is org:service, not osgi:services
>> - the interface needs to match what you export in blueprint below where you 
>> have javax.sql.XADataSource rather than just javax.sql.DataSource
>> 
>> Hope this helps :)
>> 
>> Valentin
>> 
>> On 18 Sep 2010, at 11:11, Bengt Rodehav wrote:
>> 
>>> I cannot seem to get OpenJPA and MySQL to work in Aries. I use Aries 
>>> 0.2-incubating, OpenJPA 2.0.1 and the 5.1.13 version of MySQL's JDBC driver.
>>> 
>>> I have no problems connecting to MySQL outside of OSGi but cannot get it to 
>>> work in OSGi. BTW I mostly use PaxExam for the Aries tests and I run on 
>>> Felix 2.0.0.
>>> 
>>> My persistence.xml looks as follows:
>>> 
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <persistence xmlns="http://java.sun.com/xml/ns/persistence"; 
>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>>>   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
>>> http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd";
>>>   version="2.0">
>>>   <persistence-unit name="refdataPU" transaction-type="JTA">
>>>     
>>> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
>>>     
>>> <jta-data-source>osgi:services/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/refdatajta)</jta-data-source>
>>>     <class>se.digia.sts.refdata.domain.Account</class>
>>>     <class>se.digia.sts.refdata.domain.BusinessUnit</class>
>>>     <class>se.digia.sts.persistence.EntityBase</class>
>>>     <exclude-unlisted-classes>true</exclude-unlisted-classes>
>>>     <properties>
>>>       <property name="openjpa.Connection2URL" 
>>> value="jdbc:mysql://localhost:3306/refdata" />
>>>       <property name="openjpa.Connection2DriverName" 
>>> value="com.mysql.jdbc.Driver" />
>>>       <property name="openjpa.Connection2UserName" value="someuser" />
>>>       <property name="openjpa.Connection2Password" value="somepassword" />
>>>       <property name="openjpa.ConnectionFactoryMode" value="managed" />
>>>       <property name="openjpa.jdbc.SynchronizeMappings" 
>>> value="buildSchema(ForeignKeys=true)" />
>>>       <property name="openjpa.jdbc.DBDictionary" 
>>> value="org.apache.openjpa.jdbc.sql.MySQLDictionary" />
>>>       <property name="openjpa.jdbc.UpdateManager" value="operation-order" />
>>>       <property name="openjpa.Log" value="DefaultLevel=TRACE, Tool=INFO" />
>>>     </properties>
>>>   </persistence-unit>
>>> </persistence>
>>> 
>>> and the blueprint for my datasource looks as follows:
>>> 
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"; 
>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>>>   xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0"; 
>>> default-activation="lazy">
>>> 
>>>   <bean id="refdataXADataSource" 
>>> class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource">
>>>       <property name="user" value="someuser" />
>>>       <property name="password" value="somepassword" />
>>>       <property name="URL" value="jdbc:mysql://localhost:3306/refdata" />
>>> <!--      <property name="driverClassName" value="com.mysql.jdbc.Driver" 
>>> />-->
>>> <!--      <property name="url" value="jdbc:mysql://localhost:3306/refdata" 
>>> />-->
>>>   </bean>
>>> 
>>>   <service ref="refdataXADataSource" interface="javax.sql.XADataSource">
>>>     <service-properties>
>>>       <entry key="osgi.jndi.service.name" value="jdbc/refdatajta" />
>>>     </service-properties>
>>>   </service>
>>>  
>>> </blueprint>
>>> 
>>> I get the following exception:
>>> 
>>> <openjpa-2.0.1-r422266:989424 nonfatal general error> 
>>> org.apache.openjpa.persistence.PersistenceException: There were errors 
>>> initializing your configuration: <openjpa-2.0.1-r422266:989424 fatal user 
>>> error> org.apache.openjpa.util.UserException: A connection could not be 
>>> obtained for driver class "null" and URL "null".  You may have specified an 
>>> invalid URL.
>>>     at 
>>> org.apache.openjpa.jdbc.schema.DataSourceFactory.newConnectException(DataSourceFactory.java:261)
>>>     at 
>>> org.apache.openjpa.jdbc.schema.DataSourceFactory.installDBDictionary(DataSourceFactory.java:247)
>>>     at 
>>> org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getConnectionFactory(JDBCConfigurationImpl.java:728)
>>> 
>>> 
>>> I've tried numerous ways to configure the MysqlXADataSource to no avail. 
>>> Seems like this must be a very common combination which leads me to hope 
>>> that someone can help me out. The only samples I've seen in combination 
>>> with Aries uses a Derby database that doesn't seem to need any 
>>> configuration.
>>> 
>>> I don't think there is anything wrong with the actual settings (user, 
>>> password, URL) since they work perfectly outside of OSGi. However, the 
>>> settings don't seem to get to the data source. I've probably not fully 
>>> understood how this works. My next step would be to somehow configure a 
>>> connection pool but it seems like just getting things to work occupies most 
>>> of time right now.
>>> 
>>> Any clues?
>>> 
>>> /Bengt
>>> 
>> 
>> 
> 
> 

Reply via email to