【发布时间】: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