当Hibernate 3没有时,Hibernate 4是否需要事务?

时间:2017-09-20 20:02:27

标签: java spring hibernate

我正在努力升级遗留项目,尝试将其从Hibernate 3升级到Hibernate 4.此功能在Hibernate 3下运行正常。

我查看了其他一些帖子(thisthisthis),但没有一个完全适用(因为此处使用了静态方法)。< / p>

我正在努力升级遗留项目,尝试将其从Hibernate 3升级到Hibernate 4.此功能在Hibernate 3下运行正常。

我们只想用最少的Java更改进行升级。

Hibernate抱怨没有获得事务同步的Hibernate会话,但Hibernate 3中没有使用Hibernate事务。请注意,由于使用了(令人不愉快的)静态方法,因此添加@Transactional注释并非易事。并使它工作。

非常感谢任何帮助。 Stacktrace和代码如下。 (请注意,我们使用的是Spring webflow,但这似乎并不相关。)

org.springframework.webflow.execution.ActionExecutionException: Exception thrown executing [AnnotatedAction@7571cf0e targetAction = [EvaluateAction@312ccc10 expression = myController.createModel(), resultExpression = flowScope.myModel], attributes = map[[empty]]] in state 'null' of flow 'my' -- action execution attributes were 'map[[empty]]'
    at org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:60)
    at org.springframework.webflow.engine.ActionList.execute(ActionList.java:154)
    at org.springframework.webflow.engine.Flow.start(Flow.java:526)
    at org.springframework.webflow.engine.impl.FlowExecutionImpl.start(FlowExecutionImpl.java:368)
    at org.springframework.webflow.engine.impl.FlowExecutionImpl.start(FlowExecutionImpl.java:223)
    at org.springframework.webflow.executor.FlowExecutorImpl.launchExecution(FlowExecutorImpl.java:140)
    at org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:238)
    at org.springframework.webflow.mvc.servlet.FlowController.handleRequest(FlowController.java:174)
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:50)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:844)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:346)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
    at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl._doFilterImpl(TrinidadFilterImpl.java:303)
    at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:208)
    at org.apache.myfaces.trinidad.webapp.TrinidadFilter.doFilter(TrinidadFilter.java:92)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
    at gov.treas.fms.sam.web.security.SamStrictSecurityFilter.doFilter(SamStrictSecurityFilter.java:48)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
    at com.my.package.security.SecurityFilter.doFilter(SecurityFilter.java:58)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
    at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3436)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
    at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2285)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2201)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1572)
    at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:255)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)
Caused by: org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
    at com.my.package.persistence.QueryRunner.execute(QueryRunner.java:301)
    at com.my.package.persistence.QueryRunner.execute(QueryRunner.java:292)
    at com.my.package.persistence.QueryRunner.execute(QueryRunner.java:258)
    at com.my.package.persistence.QueryRunner.execute(QueryRunner.java:246)
    at com.my.package.SystemType.findAvailableSystemTypesFromSystems(SystemType.java:130)
    at com.my.package.MyControllerImpl.getSystemTypes(CashFlowControllerImpl.java:369)
    at com.my.package.MyControllerImpl.createModel(MyControllerImpl.java:191)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:113)
    at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:129)
    at org.springframework.expression.spel.ast.MethodReference.access$000(MethodReference.java:49)
    at org.springframework.expression.spel.ast.MethodReference$MethodValueRef.getValue(MethodReference.java:347)
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:88)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:131)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:299)
    at org.springframework.binding.expression.spel.SpringELExpression.getValue(SpringELExpression.java:84)
    at org.springframework.webflow.action.EvaluateAction.doExecute(EvaluateAction.java:75)
    at org.springframework.webflow.action.AbstractAction.execute(AbstractAction.java:188)
    at org.springframework.webflow.execution.AnnotatedAction.execute(AnnotatedAction.java:145)
    at org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51)
    ... 48 more

SystemType.java:

   private static final String QUERY_GET_SYSTEM_TYPES_FROM_SYSTEMS = "select distinct (st.systemType.typeCode) from "
                + com.my.package.System.class.getName()
                + " st "
            + " order by st.systemType.typeCode";

   public static List<SystemType> findSystemTypes()
    {
        List<String> list = QueryRunner
                .execute(QUERY_GET_SYSTEM_TYPES_FROM_SYSTEMS);
        List<SystemType> systemTypes = new ArrayList<SystemType>();
        for (String systemTypeString : list)
        {
            convertToSystemType(systemTypeString);
            systemTypes.add(systemType);
        }
        return systemTypes;
    }

QueryRunner:

private static <T> List<T> execute(final String query) {
    final SessionFactory sessionFactory = getSessionFactory();
    //below line is where the exception is thrown
    final SessionImpl session = (SessionImpl) sessionFactory.getCurrentSession();
...
}

myController的:

@Component("myController")
public class MyControllerImpl {

    public MyModel createModel() {
        return new MyModel(getSystemTypes());
    }   

    protected List<SystemType> getSystemTypes() {
        return SystemType.findSystemTypesFrom();
    }
...
}

Spring config:

<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true" xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
    <bean id="hibernateAopInterceptor" class="org.springframework.orm.hibernate4.support.OpenSessionInterceptor">
        <property name="sessionFactory" ref="hibernateSessionFactory"/>
    </bean>

<bean id="hibernateProxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean" abstract="true">
        <property name="interceptorNames">
            <list>
                <value>hibernateAopInterceptor</value>
            </list>
        </property>
    </bean>
    <bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="configLocations" value="classpath:hibernate.mappings.xml"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.default_schema">${prop.hibernate.default.schema}</prop>
                <prop key="hibernate.dialect">${prop.hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${prop.hibernate.show.sql}</prop>
                <prop key="hibernate.transaction.jta.platform">org.hibernate.service.jta.platform.internal.WeblogicJtaPlatform</prop>
                <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
                <prop key="hibernate.transaction.factory_class">org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory</prop>
                <prop key="current_session_context_class">jta</prop>
            </props>
        </property>
    </bean>
</beans>


<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true" xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
        <bean id="transactionProxyFactory" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
            <property name="optimize" value="true"/>
            <property name="postInterceptors">
                <list>
                    <ref bean="hibernateAopInterceptor"/>
                </list>
            </property>
            <property name="proxyTargetClass" value="false"/>
            <property name="transactionAttributes">
                <props>
                    <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
                </props>
            </property>
            <property name="transactionManager" ref="transactionManager"/>
        </bean>
        <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="dataSource" ref="dataSource"/>
            <property name="nestedTransactionAllowed" value="true"/>
            <property name="sessionFactory" ref="hibernateSessionFactory"/>
        </bean>

    </beans>

<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true" xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jms="http://www.springframework.org/schema/jms"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"      
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-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/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <context:component-scan base-package="com.my.package" annotation-config="true"/>

</beans>

0 个答案:

没有答案