【问题标题】:How to configure transaction management for spring 4/hibernate 4.3 app deployed to WAS 8如何为部署到 WAS 8 的 spring 4/hibernate 4.3 应用程序配置事务管理
【发布时间】:2014-07-17 00:56:42
【问题描述】:

已经找到了一百万个关于此的帖子,并尝试了同样多的方法。事实上,我在任何地方都找不到使用 Hibernate 配置 Spring 应用程序的示例,该示例在 Websphere 8(.5) 中支持 OK。

这是我的弹簧配置:

@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();
    }
}

所示版本在本地 Jetty 环境中运行良好。在部署到 Websphere 时,开始事务时会引发异常:

org.hibernate.HibernateException: No CurrentSessionContext configured!

您可以在配置 2 中看到之前注释掉的方法。前者setJtaTransactionManager 来自http://docs.spring.io/spring/docs/4.0.2.RELEASE/javadoc-api/org/springframework/orm/hibernate4/LocalSessionFactoryBuilder.html 上的类级javadoc 注释。 但如果我应该在里面放点东西,那我就不知道是什么了。

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>

编辑 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

【问题讨论】:

  • 为什么必须使用 AspectJ 代理?您不使用接口吗? Spring 是围绕使用类的接口而设计的。这就是自动装配最有效的方式。如果你想要一个关于如何将 Hibernate 4 添加到现有 Spring 项目的教程,并解释你的配置选项,请查看我写的教程 here 但是,我只展示了如何进行 XML 配置,但你应该能够将其移植到基于 Java 的配置中。
  • 另外,你不必启用 AOP 来让 Hibernate 工作,如果你想编写自定义方面,你只需要启用 AOP
  • 为什么您认为是 WebSphere 部署导致了问题?该异常在哪里抛出?
  • @JamesMassey 感谢您的 cmets。我们主要有接口,但有几个类没有。我不认为这是一个专业。我猜你正在谈论的AOP依赖是通过aspectj?我们只是用于类的 Hibernate/spring 代理。
  • @JamesMassey 在尝试访问当前会话时,我们的 DAO 层会抛出异常(我们在此之上的服务层类在类级别是 @Transactional)。 ... at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1012) foobar.repository.impl.NetworkOperatorDao.findNetworkOperator(NetworkOperatorDao.java:48) ... spring proxying calls... org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)。在 Jetty 中运行良好,但在 Websphere 中运行良好,因此采用了我的方法。谢谢

标签: java spring hibernate websphere-8


【解决方案1】:

我只在从 4.1.0 升级到 4.3.5 时遇到问题。除非您需要 4.3.5 功能,否则您不需要一直降级到 3。4.3.5 版本在 Jetty 中确实可以正常工作。这只是我遇到问题的 websphere。想象一下。

【讨论】:

  • 谢谢埃里克。从那以后,我尝试了 4.3.6、4.3.5 和 4.3.4,但都不起作用(同样的 No CurrentSessionContext 错误)。 4.1 和 4.2 工作,所以现在坚持使用 4.2.15.Final。您是否发现了一个使用 Hibernate 的错误报告?
猜你喜欢
  • 2010-11-13
  • 2017-07-30
  • 2011-07-05
  • 2016-03-10
  • 2022-01-27
  • 2016-07-25
  • 2012-10-16
  • 2013-01-27
  • 1970-01-01
相关资源
最近更新 更多