# Jboss 7 - Spring - Benutzung von Jboss TransactionManager



## y0dA (9. Jan 2013)

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:

```
<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:

```
<?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


----------



## JimPanse (9. Jan 2013)

jboss-as7-1-with-spring-3-1


----------



## y0dA (10. Jan 2013)

Ok nach diverses Hinweisen hab ich nun die applicationContext.xml sowie die persistence.xml angepasst:


```
<?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:


```
<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:

```
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


----------



## JimPanse (10. Jan 2013)

Ich denke mal es ist besser ein Hibernate 3 Modul anzulegen how-to-use-hibernate-3-as-jpa-provider
und Hibernate-Spatial mit als Resources in dem Modul zu hinterlegen.


----------



## y0dA (10. Jan 2013)

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:


```
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..


----------



## JimPanse (10. Jan 2013)

JPA+Reference+Guide


----------



## y0dA (10. Jan 2013)

Kann die oben schon erwähnte ClassCastException

```
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"?


----------



## JimPanse (10. Jan 2013)

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.


----------



## y0dA (10. Jan 2013)

JimPanse hat gesagt.:


> 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.



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?


----------

