JPA Jboss 7 - Spring - Benutzung von Jboss TransactionManager

Dieses Thema JPA - Jboss 7 - Spring - Benutzung von Jboss TransactionManager im Forum "Data Tier" wurde erstellt von y0dA, 9. Jan. 2013.

Thema: Jboss 7 - Spring - Benutzung von Jboss TransactionManager Hi! Benutze folgende relevante Technologien: Jboss 7.1.1 (Applikation läuft dann in einem Cluster), Hibernate...

  1. Hi!
    Benutze folgende relevante Technologien: Jboss 7.1.1 (Applikation läuft dann in einem Cluster), Hibernate 3.6.9, Spring 3.0.1.

    Aktuell verhält es sich so dass ich eine Datasource am JBoss definiert habe und selbige mittels JNDI in der applicationContext.xml anspreche sowie einen TransactionManager definiere

    applicationContext.xml:
    Code (Java):

            <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
            <property name="jndiName" value="${database.jndi.path}" />
            </bean>

        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
            <property name="entityManagerFactory" ref="entityManagerFactory" />
            <property name="dataSource" ref="dataSource" />
        </bean>

        <bean id="entityManagerFactory"
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="persistenceUnitName" value="myDb" />
            <property name="dataSource" ref="dataSource" />
            <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" />
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <property name="databasePlatform" value="org.hibernate.dialect.SQLServerDialect" />
                    <property name="showSql" value="false" />
                    <property name="generateDdl" value="false" />
                </bean>
            </property>
        </bean>
     
    persistence.xml:
    Code (Java):

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence"      
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             version="2.0"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    >
      <persistence-unit name="xxx" transaction-type="RESOURCE_LOCAL">
      <!-- a lot of <class>com.MyClass</class> -->
       <properties>
            <property name="jboss.as.jpa.managed" value="false"/>
            <property name="hibernate.dialect"
            value="org.hibernate.spatial.dialect.sqlserver.SqlServer2008SpatialDialect"/>
        </properties>
    </persistence-unit>
     
    Soweit so gut bzw. funktioniert das Ganze. Jetzt würde ich aber noch gerne den TransactionsManager vom JBoss benutzen und das bekomme ich einfach nicht hin. Was muss ich hierbei alles berücksichtigen?

    Meine Gedanken dazu:
    -) Die Bean 'entityManagerFactory' aus der applicationContext.xml entfernen/löschen.
    -) In der applicationContext.xml folgendes hinzufügen: <tx:jta-transaction-manager/>.
    -) In der persistence.xml von 'RESOURCE_LOCAL' auf 'JTA' (ist default) umstellen. (Es ist ja wohl unerläßlich auf JTA umzustellen oder?).
    -) Muss ich dann auch im JBoss die Datasource als XA Datasource definieren (aktuell nicht der Fall obwohl der Driver es könnte)?
    -) In der persistence.xml das property jboss.as.jpa.managed" auf true (ist default) setzen?
    -) Muss ich dann nicht auf noch den TransactionManager am JBoss definieren und/oder in der applicationContext.xml irgendwie (JNDI?) setzen?

    Bitte um Unterstützung komme hier nicht weiter :(
     
    Zuletzt bearbeitet: 9. Jan. 2013
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. Ok nach diverses Hinweisen hab ich nun die applicationContext.xml sowie die persistence.xml angepasst:

    Code (Java):

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
        <persistence-unit name="my_unit" transaction-type="JTA">

            <properties>
                <property name="jboss.entity.manager.factory.jndi.name" value="java:jboss/my_unit" />

                <property name="hibernate.dialect"
                    value="org.hibernate.spatial.dialect.sqlserver.SqlServer2008SpatialDialect" />
            </properties>
        </persistence-unit>
    </persistence>
     
    applicationContext.xml:

    Code (Java):

            <jee:jndi-lookup id="my_unit" jndi-name="java:jboss/my_unit" />
       
       
        <tx:jta-transaction-manager/>


        <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
            <property name="jndiName" value="${database.jndi.path}" />
        </bean>
     
    Dann bekomme ich beim deployen folgende Fehlermeldung:
    Code (Text):

    aused by: javax.persistence.PersistenceException: [PersistenceUnit: my_unit] Unable to build EntityManagerFactory
        at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914)
        at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889)
        at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:162)
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.start(PersistenceUnitServiceImpl.java:85)
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
        ... 3 more
    Caused by: org.hibernate.HibernateException: Dialect class not found: org.hibernate.spatial.dialect.sqlserver.SqlServer2008SpatialDialect
        at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:76)
        at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:64)
        at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:176)
        at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
        at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:71)
        at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2270)
        at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2266)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1735)
        at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:84)
        at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
        ... 9 more
    Caused by: org.hibernate.service.classloading.spi.ClassLoadingException: Unable to load class [org.hibernate.spatial.dialect.sqlserver.SqlServer2008SpatialDialect]
        at org.hibernate.service.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:141)
        at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:73)
        ... 20 more
    Caused by: java.lang.ClassNotFoundException: Could not load requested class : org.hibernate.spatial.dialect.sqlserver.SqlServer2008SpatialDialect
        at org.hibernate.service.classloading.internal.ClassLoaderServiceImpl$1.findClass(ClassLoaderServiceImpl.java:99)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306) [rt.jar:1.6.0_32]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247) [rt.jar:1.6.0_32]
        at org.hibernate.service.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:138)
        ... 21 more
     
    Im .war sind folgende Hibernate Jars enthalten:
    hibernate-commons-annotations-3.2.0.Final.jar
    hibernate-core-3.6.9.Final.jar
    hibernate-entitymanager-3.6.9.Final.jar
    hibernate-jpa-2.0-api-1.0.1.Final.jar
    hibernate-spatial-1.1.1.jar
    hibernate-spatial-sqlserver-1.1.1.jar
    hibernate-validator-4.2.0.Final.jar
     
    Zuletzt bearbeitet: 10. Jan. 2013
  4. Hmm.. Entschuldige mein Unwissen aber wofür ist dieses Modul bzw. was sollte das an dem Error ändern? Du meinst das aktuell die jars die im .war liegen nicht beim Erstellen der Factory "herangezogen"/gefunden werden und ich sie deshalb als Module am JBoss ablegen sollte? Hier kommt ja echt eins zum anderen.. Oder gehts darum dass der JBoss eigentlich Hibernate 4 "voraussetzt" bzw. selbige JArs "besitzt"?

    Zu Testzwecken habe ich den dialect mal auf 'org.hibernate.dialect.SQLServerDialect' geändert und nun bekomme ich folgende Fehlermeldung:

    Code (Text):

    Caused by: javax.persistence.PersistenceException: [PersistenceUnit: myUnit] Unable to build EntityManagerFactory
        at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914)
        at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889)
        at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:162)
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.start(PersistenceUnitServiceImpl.java:85)
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
        ... 3 more
    Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.service.jdbc.connections.spi.ConnectionProvider]
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:187)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:150)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
        at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:234)
        at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:91)
        at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
        at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:71)
        at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2270)
        at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2266)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1735)
        at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:84)
        at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
        ... 9 more
    Caused by: org.hibernate.HibernateException: Could not instantiate connection provider [org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider]
        at org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider(ConnectionProviderInitiator.java:190)
        at org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:112)
        at org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:54)
        at org.hibernate.service.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:69)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:177)
        ... 22 more
    Caused by: java.lang.ClassCastException: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider cannot be cast to org.hibernate.service.jdbc.connections.spi.ConnectionProvider
        at org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider(ConnectionProviderInitiator.java:187)
        ... 26 more
     
    Ziemliches Drama das Ganze..
     
    Zuletzt bearbeitet: 10. Jan. 2013
  5. Kann die oben schon erwähnte ClassCastException
    Code (Java):
    Caused by: java.lang.ClassCastException: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider cannot be cast to org.hibernate.service.jdbc.connections.spi.ConnectionProvider
        at org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider(ConnectionProviderInitiator.java:187)
        ... 26 more
    daher rühren dass sich nun meine hibernate 3 jars mit den hibernate 4 jars am jboss "beissen"?
     
  6. Ohne es getestet zu haben aber wenn ich die Doku richtig verstanden habe wird der JBoss die jar's in dem war ignorieren und die Default Hibernate Implementierung verwenden.
     
  7. Gut das erklärt dann zumindest warum der Spatial Dialekt nicht gefunden werden kann, am besten ich mach mal das Module und teste oder migriere auf Hibernate 4..

    Aber würde das nicht auf bedeuten dass der Jboss aktuell auch schon die Hibernate Jars vom .war ignoriert hat? Warum gabs dann bisher keine Probleme?
     
    Zuletzt bearbeitet: 10. Jan. 2013
  8. Kostenloses Java-Grundlagen Training im Wert von 39 €
    Schau dir jetzt hier das Tutorial an und starte richtig durch!