Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HibernateInterceptor with spring 3.1 and hibernate 4.01

I'm running into problems upgrading from hibernate 3.6 to 4.0.1 (spring from 3 to 3.1).

I'm using hibernateinterceptors for injecting the session when calling some methods (e.g. a OnMessage call, Cron updater etc) and OpennSessionInView interceptor for the web requests. It has been working fine with hib 3.6 and spring 3.0, but as of hibernate4 I can't get it to work. The hibernateInterceptor is only available in the hibernate3 package and using that will not make it work

Any ideas what I should do ?

Removing the interceptor thing make me able to start things, but once I try calling the dao's from a request not from the web, I'm getting "No session bound exception".

Is there a better way to intercept the dao's then using the hibernate interceptor or should I use another technique? As said, I'm using the dao's from web requests (which are handled fine with the opensessioninview), JMS OnMessage, and SpringCron and in initialization code which is not working.

Here's the basic setup for the dao's

<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    http://www.springframework.org/schema/jms 
    http://www.springframework.org/schema/jms/spring-jms-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/jee 
        http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
        http://www.springframework.org/schema/util 
        http://www.springframework.org/schema/util/spring-util-3.0.xsd">

<bean id="someDao" class="org.springframework.aop.framework.ProxyFactoryBean"
    p:target-ref="someDaoTarget" p:proxyInterfaces="com.xxxx.MediaDataDao"
    p:interceptorNames="hibernateInterceptor" />

<bean id="someDaoTarget" class="com.xxxx.SomeDaoImpl"
    p:sessionFactory-ref="sessionFactory" />

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="hibernateInterceptor" 
  class="org.springframework.orm.hibernate3.HibernateInterceptor"
  p:sessionFactory-ref="sessionFactory" />

<bean id="sessionFactory"
  class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
  destroy-method="destroy" 
  p:dataSource-ref="dataSource">
  <property name="packagesToScan"
value="com.xxxx" />
  <property name="hibernateProperties" ref="hibernateProperties" />
 </bean>

<util:properties id="hibernateProperties">
<prop key="hibernate.hbm2dll.auto">update</prop>
<prop key="hibernate.connection.autocommit">false</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.jdbc.batch_size">500</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="javax.persistence.validation.mode">callback</prop> 
</util:properties>

Exception thrown when using the hibernate interceptor is:

Caused by: java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;
at  org.springframework.orm.hibernate3.SessionFactoryUtils.doGetSession(SessionFactoryUtils.java:322)
at org.springframework.orm.hibernate3.SessionFactoryUtils.getSession(SessionFactoryUtils.java:233)
at org.springframework.orm.hibernate3.HibernateInterceptor.getSession(HibernateInterceptor.java:145)
at org.springframework.orm.hibernate3.HibernateInterceptor.invoke(HibernateInterceptor.java:90)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy37.getAll(Unknown Source)

Or many this is a bug, the classic.Session does it exist in hibernate 4 ?

The exception is thrown from within a constructor of a class which tries to access a dao. This was working perfectly well with hibernate 3.6 but after upgrade I can't get this to work.

like image 769
Perre Avatar asked Jan 15 '12 15:01

Perre


Video Answer


1 Answers

If you are using hibernate 4.x on spring 3.1 or 4.x you you should use classes from package org.springframework.orm.hibernate4 instead of org.springframework.orm.hibernate3

HibernateInterceptor has been deprecated earlier. You should be using org.springframework.orm.hibernate4.support.OpenSessionInterceptor

like image 73
ikettu Avatar answered Oct 15 '22 18:10

ikettu