简体   繁体   English

如何为部署到WAS 8的Spring 4 / Hibernate 4.3应用程序配置事务管理

[英]How to configure transaction management for spring 4/hibernate 4.3 app deployed to WAS 8

Have found a million posts on this and tried just as many approaches. 已经找到了百万个帖子,并尝试了许多方法。 Fact is I can't find anywhere an example of configuring a Spring app with Hibernate, that has transactions supported OK in Websphere 8(.5). 事实是,我无法在任何地方找到使用Hibernate配置Spring应用程序的示例,该示例在Websphere 8(.5)中支持事务正常。

Here's my spring config: 这是我的春季配置:

@Configuration
@ComponentScan(basePackages={"foobar"})
@EnableTransactionManagement // equiv to <tx:annotation-driven/>
@EnableAspectJAutoProxy(proxyTargetClass=true) // equiv to <aop:aspectj-autoproxy/>
public class MySpringConfiguration {

    @Autowired
    private AutowireCapableBeanFactory beanFactory;

    @Bean(name = "dataSource")
    public DataSource dataSource() { 
        try {
            final javax.naming.InitialContext ic = new javax.naming.InitialContext();
            return (javax.sql.DataSource) ic.lookup(FoobarConfiguration.getInstance().getDatasourceJNDIName());
        } catch (final NamingException ne) {
            throw new RuntimeException("Failed to access JNDI lookup using (" + FoobarConfiguration.getInstance().getDatasourceJNDIName() + ")", ne);
        }
    }

    @Bean(name = "sessionFactory")
    public SessionFactory sessionFactory() {
        LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource());
        builder.scanPackages("foobar.om");

        // builder.setJtaTransactionManager(new WebSphereUowTransactionManager());
        // Didn't work. gave: org.hibernate.TransactionException: Could not register synchronization for container transaction

        Properties props = buildHibernateProperties();
        builder.addProperties(props);

        return builder.buildSessionFactory();
    }

    /**
     * These were taken, with comments, from application-config conversion
     */
    private Properties buildHibernateProperties() {
        Properties props = new Properties();

        // Set the default-schema for Hibernate to use.
        props.setProperty("hibernate.default_schema", "foobar");

        props.setProperty("hibernate.dialect", "org.hibernate.dialect.DB2Dialect");
        props.setProperty("hibernate.hbm2ddl.auto", "validate");

        // Sets the DEBUG Level of the hibernate: SQL generation layer.
        props.setProperty("hibernate.show_sql", "true");

        props.setProperty("hibernate.generate_statistics", "false");

        props.setProperty("hibernate.order_updates", "true");
        props.setProperty("hibernate.order_inserts", "true");

        // Not needed as we have Spring: http://stackoverflow.com/questions/4293098/how-to-integrate-spring-with-hibernate-session-and-transaction-management
        // props.setProperty("hibernate.current_session_context_class", "org.hibernate.context.internal.ThreadLocalSessionContext");

        props.setProperty("hibernate.cache.use_query_cache", "false");
        props.setProperty("hibernate.cache.use_second_level_cache", "false");
        return props;
    }

    @Bean(name = "transactionManager")
    public HibernateTransactionManager transactionManager() {
        return new HibernateTransactionManager(sessionFactory());
    }

    @Bean(name = "persistenceExceptionTranslationPostProcessor")
    public PersistenceExceptionTranslationPostProcessor getExceptionProcessor() {
        return new PersistenceExceptionTranslationPostProcessor();
    }
}

The version as shown works fine in local Jetty environment. 所示版本在本地Jetty环境中运行良好。 It's on deployment to Websphere that an exception is thrown when commence a transaction: 在部署到Websphere时,开始事务时会引发异常:

org.hibernate.HibernateException: No CurrentSessionContext configured!

You can see in the config 2 earlier commented-out approaches. 您可以在配置2中看到以前的注释掉的方法。 The former, setJtaTransactionManager is from the class-level javadoc note on http://docs.spring.io/spring/docs/4.0.2.RELEASE/javadoc-api/org/springframework/orm/hibernate4/LocalSessionFactoryBuilder.html . 前一个setJtaTransactionManager来自http://docs.spring.io/spring/docs/4.0.2.RELEASE/javadoc-api/org/springframework/orm/hibernate4/LocalSessionFactoryBuilder.html上的类级javadoc注释。 But if I should have something in there then I don't know what it is. 但是,如果我在那里应该有东西,那我就不知道它是什么。

mvn deps: mvn部门:

        <spring-version>4.0.5.RELEASE</spring-version>
        <hibernate-version>4.3.5.Final</hibernate-version>
        ...
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.1</version>
        </dependency>
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate-version}</version>
            <exclusions>
                <!-- The following has classes (e.g. SystemException) that clashes with 
                    an equivalent in Jetty -->
                <exclusion>
                    <groupId>org.jboss.spec.javax.transaction</groupId>
                    <artifactId>jboss-transaction-api_1.2_spec</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

EDIT 21/07: Stacktrace as requested by James: 编辑21/07:James要求的Stacktrace:

org.apache.wicket.WicketRuntimeException: Can't instantiate page using constructor 'public foobar.pages.MaintainOpPage(org.apache.wicket.request.mapper.parameter.PageParameters)' and argument ''. An exception has been thrown during construction!
        at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:194)
        at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:76)
        at org.apache.wicket.DefaultMapperContext.newPageInstance(DefaultMapperContext.java:133)
        at org.apache.wicket.core.request.handler.PageProvider.resolvePageInstance(PageProvider.java:268)
        at org.apache.wicket.core.request.handler.PageProvider.getPageInstance(PageProvider.java:166)
        at org.apache.wicket.request.handler.render.PageRenderer.getPage(PageRenderer.java:78)
        at org.apache.wicket.request.handler.render.WebPageRenderer.renderPage(WebPageRenderer.java:100)
        at org.apache.wicket.request.handler.render.WebPageRenderer.respond(WebPageRenderer.java:221)
        at org.apache.wicket.core.request.handler.RenderPageRequestHandler.respond(RenderPageRequestHandler.java:175)
        at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:862)
        at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)
        at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:261)
        at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:218)
        at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:289)
        at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:259)
        at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:201)
        at org.apache.wicket.protocol.http.WicketServlet.doGet(WicketServlet.java:137)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:575)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1224)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:774)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:456)
        at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
        at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1032)
        at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3748)
        at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304)
        at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:962)
        at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
        at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:459)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:526)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:312)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:283)
        at com.ibm.ws.ssl.channel.impl.SSLConnectionLink.determineNextChannel(SSLConnectionLink.java:1048)
        at com.ibm.ws.ssl.channel.impl.SSLConnectionLink.readyInboundPostHandshake(SSLConnectionLink.java:716)
        at com.ibm.ws.ssl.channel.impl.SSLConnectionLink$MyHandshakeCompletedCallback.complete(SSLConnectionLink.java:412)
        at com.ibm.ws.ssl.channel.impl.SSLUtils.handleHandshake(SSLUtils.java:1066)
        at com.ibm.ws.ssl.channel.impl.SSLHandshakeIOCallback.complete(SSLHandshakeIOCallback.java:87)
        at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
        at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
        at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
        at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
        at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
        at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
        at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
        at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1814)
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:80)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:57)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:539)
        at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:171)
        ... 45 more
Caused by: org.hibernate.HibernateException: No CurrentSessionContext configured!
        at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1012)
        at foobar.repository.impl.OpDao.findOp(OpDao.java:43)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
        at java.lang.reflect.Method.invoke(Method.java:613)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
        at $Proxy59.findOp(Unknown Source)
        at foobar.service.impl.OpService.generateNewTrn(OpService.java:42)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
        at java.lang.reflect.Method.invoke(Method.java:613)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
        at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
        at $Proxy62.generateNewTrn(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
        at java.lang.reflect.Method.invoke(Method.java:613)
        at org.apache.wicket.proxy.LazyInitProxyFactory$JdkHandler.invoke(LazyInitProxyFactory.java:435)
        at $Proxy69.generateNewTrn(Unknown Source)
        at foobar.pages.MaintainOpPage.<init>(MaintainOpPage.java:59)
        ... 50 more

I only had issues when I upgraded from 4.1.0 to 4.3.5. 从4.1.0升级到4.3.5时才遇到问题。 Unless you need 4.3.5 functionality you don't need to downgrade all the way to 3. The 4.3.5 version does work fine in Jetty though. 除非您需要4.3.5功能,否则无需将其完全降级到3。不过,在Jetty中4.3.5版本确实可以正常工作。 It is only websphere I have issues with. 这只是我遇到的问题。 Imagine that. 想象一下。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM