You have some good example in the Aries (in the ariestrader or blog sample).

Regards
JB

On 04/26/2012 11:09 AM, Bengt Rodehav wrote:
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 <http://osgi.jndi.service.name> = jdbc/mysqlds/

Hope that helps,

/Bengt



2012/4/26 Borut Bolčina <[email protected]
<mailto:[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 <http://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
    <http://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]
    <mailto:[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]
        <mailto:[email protected]>>

            On 19. apr. 2012, at 16:11, Christian Schneider
            <[email protected] <mailto:[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
             >





--
Jean-Baptiste Onofré
[email protected]
http://blog.nanthrax.net
Talend - http://www.talend.com

Reply via email to