Spring + Transaction Manager problems
patelm Jul 10, 2009 3:03 AMHi there again,
I am having a huge proble right now and i am wondering if anyone can please help me.
i am using Bitronix Transaction manager, Spring 2.5.6 and Tomcat and trying to get Envers to work with this but still no luck.
Right now i am getting the follwoing error when calling the transaction manager
java.lang.NullPointerException org.hibernate.transaction.JTATransaction.registerSynchronization(JTATransaction.java:313) org.hibernate.envers.synchronization.AuditSyncManager.get(AuditSyncManager.java:56) org.hibernate.envers.event.AuditEventListener.onPostUpdate(AuditEventListener.java:161) org.hibernate.action.EntityUpdateAction.postUpdate(EntityUpdateAction.java:200) org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:179) org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263) org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168) org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028) org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390) org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:420) org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:748) za.co.aforbes.fpc.db.dao.BaseHibernateDao.performSave(BaseHibernateDao.java:92) za.co.aforbes.fpc.db.dao.BaseHibernateDao.save(BaseHibernateDao.java:79) za.co.aforbes.fpc.db.dao.BaseHibernateDao.save(BaseHibernateDao.java:1) za.co.aforbes.fpc.bl.client.impl.AddressServiceImpl.save(AddressServiceImpl.java:89) za.co.aforbes.fpc.bl.client.impl.AddressServiceImpl.save(AddressServiceImpl.java:1) za.co.aforbes.fpc.ui.bean.table.EditDataTableBean.save(EditDataTableBean.java:113) za.co.aforbes.fpc.ui.bean.client.AddressBean.save(AddressBean.java:169) za.co.aforbes.fpc.ui.bean.client.AddressBean.save(AddressBean.java:1) za.co.aforbes.fpc.ui.bean.table.EditDataTableBean.performSave(EditDataTableBean.java:89) za.co.aforbes.fpc.ui.bean.BaseFormBean.save(BaseFormBean.java:49) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597)
My application context is set up as the following. Please let me know if you can see what i am doing wrong.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
">
<!-- START - IFA DATASOURCE AND SESSION FACTORY-->
<!--
Below are connection values to the database. These values are used in
the hibernate.properties file and are populated at runtime
-->
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager"
depends-on="bitronixTransactionManager"> <property
name="transactionManager" ref="bitronixTransactionManager" />
<property name="userTransaction" ref="bitronixTransactionManager" />
</bean>
<!-- Bitronix Transaction Manager embedded configuration
-->
<bean id="btmConfig" class="bitronix.tm.TransactionManagerServices"
factory-method="getConfiguration">
<property name="serverId" value="spring-btm" />
</bean>
<!-- create Bitronix Transaction Manager transaction manager -->
<bean id="bitronixTransactionManager" class="bitronix.tm.TransactionManagerServices"
factory-method="getTransactionManager" depends-on="btmConfig"
destroy-method="shutdown" />
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/ifaDB</value>
</property>
</bean>
<bean id="msqlDataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource"
init-method="init" destroy-method="close">
<property name="className"
value="com.microsoft.sqlserver.jdbc.SQLServerXADataSource" />
<property name="allowLocalTransactions" value="true" />
<property name="uniqueName" value="jdbc/ifa" />
<property name="minPoolSize" value="0" />
<property name="maxPoolSize" value="5" />
<property name="driverProperties">
<props>
<prop key="databaseName">ifa</prop>
<prop key="user">ddd</prop>
<prop key="password">ddd</prop>
</props>
</property>
</bean>
<bean id="ifaSessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="jtaTransactionManager">
<ref bean="bitronixTransactionManager"></ref>
</property>
<property name="useTransactionAwareDataSource" value="true" />
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="configLocation">
<value>WEB-INF/hibernate/hibernate-ifa.cfg.xml</value>
</property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.connection.datasource">jdbc/ifa</prop>
<prop key="hibernate.transaction.auto_close_session">true</prop>
<prop key="jta.UserTransaction">java:comp/UserTransaction</prop>
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory
</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
<!--
<prop key="hibernate.hbm2ddl.auto">update</prop>
-->
<prop key="hibernate.jndi.class">bitronix.tm.jndi.BitronixInitialContextFactory</prop>
<prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.BTMTransactionManagerLookup
</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.connection.release_mode">after_statement</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider </prop>
</props>
</property>
<property name="eventListeners">
<map>
<entry key="post-insert">
<list>
<ref bean="ejbInsert" />
<ref bean="audit" />
</list>
</entry>
<entry key="post-update">
<list>
<ref bean="ejbUpdate" />
<ref bean="audit" />
</list>
</entry>
<entry key="post-delete">
<list>
<bean class="org.hibernate.ejb.event.EJB3PostDeleteEventListener" />
<ref bean="audit" />
</list>
</entry>
<entry key="pre-collection-update">
<ref bean="audit" />
</entry>
<entry key="pre-collection-remove">
<ref bean="audit" />
</entry>
<entry key="post-collection-recreate">
<ref bean="audit" />
</entry>
</map>
</property>
</bean>
<bean name="callBack" class="org.hibernate.ejb.event.EntityCallbackHandler" />
<bean name="audit" class="org.hibernate.envers.event.AuditEventListener" />
<bean name="ejbInsert" class="org.hibernate.ejb.event.EJB3PostInsertEventListener">
<property name="callbackHandler">
<ref bean="callBack" />
</property>
</bean>
<bean name="ejbUpdate" class="org.hibernate.ejb.event.EJB3PostUpdateEventListener">
<property name="callbackHandler">
<ref bean="callBack" />
</property>
</bean>
<bean id="hibernateDao"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED, -Exception
</prop>
</props>
</property>
</bean>
<bean id="addresser" parent="hibernateDao">
<property name="target">
<ref bean="addressDao"/>
</property>
</bean>
<bean id="countrar" parent="hibernateDao">
<property name="target">
<ref bean="countryDao"/>
</property>
</bean>
<bean id="addressertype" parent="hibernateDao">
<property name="target">
<ref bean="addressTypeDao"/>
</property>
</bean>
<!-- END - IFA DATASOURCE AND SESSION FACTORY-->
<!-- START - COMMONWORKS DATASOURCE AND SESSION FACTORY-->
<!--
Below are connection values to the database. These values are used in
the hibernate.properties file and are populated at runtime
-->
<bean id="commonWorksDataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>net.sourceforge.jtds.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:jtds:sqlserver://localhost:1433/CommonWorks;prepareSQL=0;SendStringParametersAsUnicode=False;
</value>
</property>
<property name="username">
<value>ddd</value>
</property>
<property name="password">
<value>dddd</value>
</property>
<property name="initialSize">
<value>2</value>
</property>
<property name="maxActive">
<value>5</value>
</property>
<property name="maxIdle">
<value>2</value>
</property>
</bean>
<bean id="commonWorksSessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="commonWorksDataSource" />
</property>
<property name="configLocation">
<value>WEB-INF/hibernate/hibernate-commonworks.cfg.xml</value>
</property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>
<!-- END - COMMONWORKS DATASOURCE AND SESSION FACTORY-->
<!--
Configurer that replaces ${...} placeholders with values from
properties files
-->
<!-- (in this case, mail and JDBC related properties) -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>WEB-INF/spring/mail.properties</value>
<value>WEB-INF/spring/jdbc.properties</value>
</list>
</property>
</bean>
<!-- MailSender used by EmailAdvice -->
<!--
<bean id="mailSender"
class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${mail.host}"/> </bean>
-->
</beans>
Any help would be much appreciated . I am sure this is a silly config error somewhere but i can't find it.
:)
Many Thanks,
Muhammed Patel