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>
>> http://www.osgi.org/xmlns/blueprint/v1.0.0"
>> xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>
>> http://www.w3.org/2001/XMLSchema-instance"
>
> xsi:schemaLocation=" <http://www.osgi.org/xmlns/blueprint/v1.0.0>
>> http://www.osgi.org/xmlns/blueprint/v1.0.0"
>> xmlns:tx="<http://aries.apache.org/xmlns/transactions/v1.0.0>
>> http://aries.apache.org/xmlns/transactions/v1.0.0"
>
> xmlns:jpa=" <http://aries.apache.org/xmlns/jpa/v1.0.0>
>> 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]>
> [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/(<http://osgi.jndi.service.name/>
>>> osgi.jndi.service.name=jdbc/refdatajta)</jta-data-source>
>>
>> it should be
>>
>> <jta-data-source>osgi:service/javax.sql.XADataSource/(<http://osgi.jndi.service.name/>
>>> 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>
>>> http://java.sun.com/xml/ns/persistence"
>>> xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>
>>> http://www.w3.org/2001/XMLSchema-instance"
>>
>> xsi:schemaLocation=" <http://java.sun.com/xml/ns/persistence>
>>> http://java.sun.com/xml/ns/persistence
>>> <http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd>
>>> 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/(<http://osgi.jndi.service.name/>
>>> 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>
>>> http://www.osgi.org/xmlns/blueprint/v1.0.0"
>>> xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>
>>> http://www.w3.org/2001/XMLSchema-instance"
>>
>> xsi:schemaLocation=" <http://www.osgi.org/xmlns/blueprint/v1.0.0>
>>> 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=" <http://osgi.jndi.service.name/>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
>>
>>
>>
>