HibernateInterceptor с пружиной 3.1 и hibernate 4.01 - PullRequest
10 голосов
/ 15 января 2012

У меня возникают проблемы при обновлении с hibernate 3.6 до 4.0.1 (с 3 до 3.1).

Я использую hibernateinterceptors для внедрения сеанса при вызове некоторых методов (например, вызова OnMessage,Cron Updater и т. Д.) И перехватчик OpennSessionInView для веб-запросов.Он работал нормально с Hib 3.6 и Spring 3.0, но с hibernate4 я не могу заставить его работать.HibernateInterceptor доступен только в пакете hibernate3, и его использование не сможет заставить его работать

Есть идеи, что мне делать?

Удаление перехватчика дает мне возможность начать все, но как только япопробуйте вызвать дао из запроса, а не из Интернета, я получаю сообщение «Нет привязки к сессии».

Есть ли лучший способ перехватить дао, чем использовать перехватчик гибернации, или я должен использовать другую технику?Как уже было сказано, я использую дао из веб-запросов (которые обрабатываются нормально с opensessioninview), JMS OnMessage и SpringCron, а также в коде инициализации, который не работает.

Вот базовая настройка для дао

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

При использовании перехватчика гибернации возникает исключение:

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)

Или многие это ошибка, classic.Session существует ли в hibernate 4?

Исключение выдается из конструктора класса, который пытается получить доступ к dao.Это отлично работало с Hibernate 3.6, но после обновления я не могу заставить его работать.

1 Ответ

3 голосов
/ 19 января 2015

Если вы используете hibernate 4.x для весны 3.1 или 4.x, вам следует использовать классы из пакета org.springframework.orm.hibernate4 вместо org.springframework.orm.hibernate3

HibernateInterceptor устарел ранее. Вы должны использовать org.springframework.orm.hibernate4.support.OpenSessionInterceptor

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...