I modified the model bundle to include properties section in persistence.xml

<persistence version="1.0" 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_1_0.xsd";>

<persistence-unit name="weather" transaction-type="JTA">
 <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name
=jdbc/mysqlds)</jta-data-source>
 <class>si.najdi.weather.entities.WeatherCurrent</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>

<properties>
<property name="openjpa.ConnectionFactoryMode" value="managed" />
 <property name="openjpa.jdbc.DBDictionary" value="mysql(TableType=innodb)"
/>
 <property name="openjpa.Log" value="DefaultLevel=INFO, Tool=INFO" />
</properties>

</persistence-unit>
</persistence>

and reinstalled all my bundles, but it makes no difference.

I notices this in my console when the route is started:

20  WARN   [Blueprint Extender: 2] openjpa.Runtime - The configuration
property named "openjpa.Id" was not recognized and will be ignored,
although the name closely matches a valid property called "openjpa.Id".

With the TRACE level enabled, I see:

karaf@root> osgi:install -s mvn:com.mycompany/weather-model/1.0.5-SNAPSHOT
35  weather  TRACE  [Thread-10] openjpa.Runtime - Setting the following
properties from "?" into configuration:
{openjpa.ConnectionFactory=org.apache.aries.jpa.container.unit.impl.DelayedLookupDataSource@92b,
openjpa.ConnectionFactoryMode=managed,
javax.persistence.validation.mode=AUTO,
javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl,
openjpa.TransactionMode=managed,
openjpa.MetaDataFactory=jpa(Types=com.mycompany.weather.entities.WeatherCurrent),
openjpa.ClassResolver=org.apache.openjpa.persistence.PersistenceUnitInfoImpl$ClassResolverImpl@ee7fac,
javax.persistence.sharedCache.mode=UNSPECIFIED,
openjpa.Log=DefaultLevel=TRACE, Tool=INFO,
openjpa.jdbc.DBDictionary=mysql(TableType=innodb), PersistenceVersion=1.0,
openjpa.Id=weather}
58  weather  TRACE  [Thread-10] openjpa.Runtime - No cache marshaller found
for id org.apache.openjpa.conf.MetaDataCacheMaintenance.
104  weather  TRACE  [Thread-10] openjpa.MetaData - Scanning resource
"META-INF/orm.xml" for persistent types.
105  weather  TRACE  [Thread-10] openjpa.MetaData - The persistent unit
root url is "null"
105  weather  TRACE  [Thread-10] openjpa.MetaData -
parsePersistentTypeNames() found
[com.mycompany.weather.entities.WeatherCurrent].
106  weather  TRACE  [Thread-10] openjpa.MetaData - Found 1 classes with
metadata in 48 milliseconds.
1  weather  TRACE  [Thread-10] openjpa.Runtime - Setting the following
properties from "?" into configuration: {openjpa.BrokerFactory=jdbc,
javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl,
javax.persistence.sharedCache.mode=UNSPECIFIED, PersistenceVersion=1.0,
openjpa.jdbc.DBDictionary=mysql(TableType=innodb),
openjpa.Log=DefaultLevel=TRACE, Tool=INFO, openjpa.Id=weather,
openjpa.ConnectionFactoryMode=managed,
openjpa.ConnectionFactory=org.apache.aries.jpa.container.unit.impl.DelayedLookupDataSource@92b,
javax.persistence.validation.mode=AUTO, openjpa.TransactionMode=managed,
openjpa.MetaDataFactory=jpa(Types=com.mycompany.weather.entities.WeatherCurrent),
openjpa.BrokerImpl=non-finalizing,
openjpa.ClassResolver=org.apache.openjpa.persistence.PersistenceUnitInfoImpl$ClassResolverImpl@ee7fac
}
1  weather  TRACE  [Thread-10] openjpa.Runtime - Not creating a
ValidatorImpl because this app is using the JPA 1.0 Spec
1  weather  TRACE  [Thread-10] openjpa.Runtime -
org.apache.openjpa.persistence.PersistenceProviderImpl@1ad69f1 creating
container org.apache.openjpa.persistence.EntityManagerFactoryImpl@6888b for
PU weather.
Bundle ID: 137


Certanly this look strange:
Not creating a ValidatorImpl because this app is using the JPA 1.0 Spec

Digging...




Dne 26. april 2012 12:57 je Bengt Rodehav <[email protected]> napisal/-a:

> Then I guess OpenJPA can't find or does not try to find your datasource
> service. Looking at my different persistence.xml's I usually have a few
> OpenJPA properties defined, like this:
>
> *<properties>*
> *      <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.SQLServerDictionary" />*
> *      <property name="openjpa.jdbc.UpdateManager"
> value="operation-order" />*
> *      <property name="openjpa.Log" value="DefaultLevel=INFO, Tool=INFO"
> />*
> *<!--      <property name="openjpa.Log" value="DefaultLevel=TRACE,
> Tool=INFO" />-->*
> *    </properties>*
>
> One idea is to enable TRACE logging to see what OpenJPA complains about.
> Another one is that maybe the first property (the ConnectionFactoryMode)
> must be set to "managed" for this to work. I'm not sure but there is
> probably a reason why I always have that property defined.
>
> /Bengt
>
> 2012/4/26 Borut Bolčina <[email protected]>
>
>> Hello,
>>
>> yes I find this comments very useful!
>>
>> karaf@root> ls | grep -B 4 javax.sql.DataSource
>> org.apache.aries.jpa.container.context.PersistenceContextProvider
>>
>> weather-datasource (123) provides:
>> ----------------------------------
>> javax.sql.DataSource
>> karaf@root> ls 123
>>
>> weather-datasource (123) provides:
>> ----------------------------------
>> objectClass = javax.sql.DataSource
>> osgi.jndi.service.name = jdbc/mysqlds
>> osgi.service.blueprint.compname = weatherDataSource
>> service.id = 222
>> ----
>> objectClass = org.osgi.service.blueprint.container.BlueprintContainer
>> osgi.blueprint.container.symbolicname = weather-datasource
>> osgi.blueprint.container.version = 1.0.5.SNAPSHOT
>> service.id = 223
>>
>> I guess the datasource service is published correctly.
>>
>> Thanks,
>> borut
>>
>> Dne 26. april 2012 11:09 je Bengt Rodehav <[email protected]> napisal/-a:
>>
>> Hello there,
>>>
>>> I guess you should check that your datasource has been published as a
>>> service. I'm not the best Karaf guru but I would do something like this:
>>>
>>> Check what services provides datasources:
>>>
>>> *ls | grep -B 4 javax.sql.DataSource*
>>>
>>> This should identify what bundles provide datasources as services.
>>> Assume that one of the bundles had the bundle id 78, you could then look
>>> more closely at that bundles services with the following command:
>>>
>>> *ls 78*
>>> *
>>> *
>>> You will now see the services provided by this bundle and also its
>>> service properties. You should see a line similar to:
>>>
>>> *osgi.jndi.service.name = jdbc/mysqlds*
>>>
>>> Hope that helps,
>>>
>>> /Bengt
>>>
>>>
>>>
>>> 2012/4/26 Borut Bolčina <[email protected]>
>>>
>>>> Hello,
>>>>
>>>> thanks Bengt for your input, I really appreciate you took the time!
>>>>
>>>> My work on this is somehow sporadic, but now I have managed to get the
>>>> Camel route running in Karaf
>>>>
>>>> from("quartz://weather/currentWeatherSlovenia?cron=0+0/1+*+?+*+*")
>>>>  .log("Getting weather from: " + sourceUrl)
>>>> .to(sourceUrl)
>>>>  .split()
>>>> .tokenizeXML("metData")
>>>>  .unmarshal(jaxbDataFormat)
>>>>
>>>> .to("jpa:com.mycompany.weather.entities.WeatherCurrent?persistenceUnit=weather");
>>>>
>>>> with the exception of saving the data to the database which fails with:
>>>>
>>>> Caused by: <openjpa-2.2.0-r422266:1244990 fatal user error>
>>>> org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or
>>>> DataSource class name must be specified in
>>>> the ConnectionDriverName property. Available properties in
>>>> configuration are
>>>> "org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl@442ce698".
>>>>         at
>>>> org.apache.openjpa.jdbc.schema.DataSourceFactory.newDataSource(DataSourceFactory.java:72)[125:org.apache.openjpa:2.2.0]
>>>>         at
>>>> org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.createConnectionFactory(JDBCConfigurationImpl.java:844)[125:org.apache.openjpa:2.2.0]
>>>>         at
>>>> org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getDBDictionaryInstance(JDBCConfigurationImpl.java:602)[125:org.apache.openjpa:2.2.0]
>>>>         at
>>>> org.apache.openjpa.jdbc.meta.MappingRepository.endConfiguration(MappingRepository.java:1510)[125:org.apache.openjpa:2.2.0]
>>>>         at
>>>> org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:518)[125:org.apache.openjpa:2.2.0]
>>>> ....
>>>>
>>>> My datasource bundle is deployed in OSGi (later the username and
>>>> password will be configurable, that is - outside of the bundle)
>>>>
>>>> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";>
>>>>
>>>>  <bean id="weatherDataSource"
>>>> class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource">
>>>> <property name="url"
>>>>  value="jdbc:mysql://
>>>> dev.mycompany.com:3306/weather?useUnicode=yes&amp;characterEncoding=UTF-8<http://dev.mycompany.com:3306/weather?useUnicode=yes&characterEncoding=UTF-8>"
>>>> />
>>>>  <property name="user" value="myUsername" />
>>>> <property name="password" value="myPassword" />
>>>>  </bean>
>>>>
>>>> <service interface="javax.sql.DataSource" ref="weatherDataSource">
>>>>  <service-properties>
>>>> <entry key="osgi.jndi.service.name" value="jdbc/mysqlds" />
>>>>  </service-properties>
>>>> </service>
>>>>  </blueprint>
>>>>
>>>> which is used by my model bundle's persistence.xml
>>>>
>>>> <persistence version="1.0" 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_1_0.xsd";>
>>>>   <persistence-unit name="weather" transaction-type="JTA">
>>>>
>>>> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
>>>> <jta-data-source>osgi:service/javax.sql.DataSource/(
>>>> osgi.jndi.service.name=jdbc/mysqlds)</jta-data-source>
>>>>  <class>my.company.weather.entities.WeatherCurrent</class>
>>>> <exclude-unlisted-classes>true</exclude-unlisted-classes>
>>>>  </persistence-unit>
>>>> </persistence>
>>>>
>>>> I think the problem is that my model bundle is not seeing the
>>>> datasource service. How do I confirm that or how should my model's
>>>>  MANIFEST look like?
>>>>
>>>> Cheers,
>>>> borut
>>>>
>>>>
>>>> Dne 19. april 2012 20:35 je Bengt Rodehav <[email protected]>napisal/-a:
>>>>
>>>> A few years back Hibernate was my choice. The past two years I have
>>>>> moved to OpenJPA. The main reason is that OpenJPA works much better with
>>>>> OSGi. I did try EclipseLink as well but had OSGi problems. This was a 
>>>>> while
>>>>> back and has probably been improved by now.
>>>>>
>>>>> Another reason why I prefer OpenJPA to Hibernate is that the Apache
>>>>> community is so much better - much more open. I'm sure this is a matter of
>>>>> taste but I would not go for Hibernate.
>>>>>
>>>>> That said, OpenJPA also has some classloading issues under OSGi. In
>>>>> normal situations it works though. A final compelling reason to use 
>>>>> OpenJPA
>>>>> is that it is much more common choice when using Apache Karaf (I think).
>>>>> It's normally easier to use different Apache projects together since
>>>>> someone else has always done it before.
>>>>>
>>>>> What I don't like is the way JPA uses the persistence.xml. I tend to
>>>>> go with the approach Christian recommended - to put the datasource in a
>>>>> separate bundle. It can then easily be switched. In practice, though, it's
>>>>> hard to actually change database type (not just url) without having to
>>>>> affect the application.
>>>>>
>>>>> First, the JPA implementation is configured in persistence.xml. E g
>>>>> that's where you specify database dialect for OpenJPA. Ideally this would
>>>>> be separated from the persistence.xml and possible to configure (e g with
>>>>> OSGi's config admin).
>>>>>
>>>>> Second, at least when using JPA annotations (which I do), your source
>>>>> code becomes tailored for a certain database type. I often startup with a
>>>>> simple Derby database for testing and then move  to SQLServer for
>>>>> production. In that process I often have to change some annotations to 
>>>>> make
>>>>> it work in SQLServer.
>>>>>
>>>>> Overall I'm quite content with the OpenJPA+Aries+Karaf combo though. I
>>>>> just wish that Aries could get their release process straightened out 
>>>>> soon.
>>>>>
>>>>> /Bengt
>>>>>
>>>>>
>>>>> 2012/4/19 Borut Bolcina <[email protected]>
>>>>>
>>>>>> On 19. apr. 2012, at 16:11, Christian Schneider <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>> > I guess the suggested way is to not run hibernate :-) For me the
>>>>>> fact that they do not create bundles says that jboss does not care about
>>>>>> OSGi in hibernate. As they now have an OSGi server with JBoss 7 that may
>>>>>> change soon though.
>>>>>>
>>>>>> I just looked at JBoss website and their support is not even in
>>>>>> dipers. See https://issues.jboss.org/browse/JBOSGI-260.
>>>>>>
>>>>>> > I had some good experience with apache openjpa together with apache
>>>>>> aries jpa. Together they solve the classloading problem where the jpa
>>>>>> provider can not see the user classes. I have not built bigger 
>>>>>> applications
>>>>>> with it though.
>>>>>>
>>>>>> I will try with OpenJPA, but would really like to hear other people's
>>>>>> hibernate stories!
>>>>>>
>>>>>> >
>>>>>> > There is also Eclipselink. With their affiliation to Eclipse they
>>>>>> will surely have an eye on OSGi compatibility. The problem there was that
>>>>>> they did not put their jas into the maven central repo.
>>>>>> >
>>>>>> > So all in all I am not sure what to recommend. Perhaps others
>>>>>> already have experience with some jpa solution in bigger projects?
>>>>>>
>>>>>> Please share some stories to make my decision easier.
>>>>>>
>>>>>> Borut
>>>>>>
>>>>>> >
>>>>>> > Christian
>>>>>> >
>>>>>> > Am 19.04.2012 15:56, schrieb Borut Bolčina:
>>>>>> >> Thanks Christian,
>>>>>> >>
>>>>>> >> I understand now what you were suggesting. The database type
>>>>>> (vendor) will be the same in all environments (mysql), but with different
>>>>>> addresses, engine types, usernames and passwords, which brings another
>>>>>> topic up - configuration (I will probably ask this in days to come).
>>>>>> >>
>>>>>> >> I will be separating datasources, it is just the case that I want
>>>>>> a working solution and then smooth it out.
>>>>>> >>
>>>>>> >> For a begginer it is very hard to get a hibernate mysql combo to
>>>>>> work (mine still does not). There are examples for persistence, but I had
>>>>>> to read a lot until I found that Hibernate does not even has bundles,
>>>>>> therefore tricks has to be performed.
>>>>>> >>
>>>>>> >> Is there "an official Karaf Hibernate Feature"? If not, what is
>>>>>> the suggested way to run Hibernate in Karaf? I am planning to use 
>>>>>> Hibernate
>>>>>> Search, Solr and Lucene by using Camel components, so I have lots of 
>>>>>> ground
>>>>>> to cover.
>>>>>> >>
>>>>>> >> Cheers,
>>>>>> >> borut
>>>>>> >>
>>>>>> >
>>>>>> > --
>>>>>> > Christian Schneider
>>>>>> > http://www.liquid-reality.de
>>>>>> >
>>>>>> > Open Source Architect
>>>>>> > Talend Application Integration Division http://www.talend.com
>>>>>> >
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>

Reply via email to