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