本文介绍了Spring Webapp with Hibernate, Annotation Driven, Issue after Issue, Source Code Link的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用注释和 Hibernate 开发 Spring Web 应用程序.这里的目标之一是使应用程序对堆栈的所有元素进行注释驱动(而不是 XML),现在只是 spring 和 hibernate.我在这里询问的有关此代码的此问题和其他问题的每个解决方案都会导致问题的重击式问题,但这并不难.请试试这个代码!这比我们逐点展示堆栈跟踪要容易得多.

包含一个 Github 链接,只需 git clone、maven clean 包,并部署到合适的服务器(例如 Jetty),您就可以看到所有这些痕迹在起作用.

这是如何开始的:在启动 web 应用程序时,我收到以下 no class def found 错误:

java.lang.noclassdeffounderror L[org.hibernate.engine.FilterDefinition

我使用的是 Hibernate 4.3.4

并且正在使用核心 jar

 <依赖><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>${hibernate.version}</version></依赖>

这是痕迹

org.springframework.beans.factory.BeanCreationException:创建名为userService"的 bean 时出错:自动装配依赖项的注入失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.mobiusinversion.web.repositories.UserRepository com.mobiusinversion.web.services.UserService.userRepository;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为userRepository"的 bean 时出错:自动装配依赖项的注入失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 org.hibernate.SessionFactory com.mobiusinversion.web.repositories.UserRepository.sessionFactory;嵌套异常是 java.lang.NoClassDefFoundError: [Lorg/hibernate/engine/FilterDefinition;在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700)在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)在 org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)在 org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:530)在 org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)在 org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)在 javax.servlet.GenericServlet.init(GenericServlet.java:244)

现在搜索 Maven 中心,我看到该类在 Hibernate 3.1 中,所以现在我已将其添加到我的 pom 中

 <依赖><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>${hibernate4.version}</version></依赖><依赖><groupId>org.hibernate</groupId><artifactId>休眠</artifactId><version>${hibernate3.version}</version></依赖>

连同以下必需的存储库(这是一个未记录的要求,GROWL)

<存储库><id>java.net</id><url>http://download.java.net/maven/2/</url></repository></repositories>

然而,这导致了以下跟踪

org.springframework.beans.factory.BeanCreationException:创建名为userService"的 bean 时出错:自动装配依赖项的注入失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.mobiusinversion.web.repositories.UserRepository com.mobiusinversion.web.services.UserService.userRepository;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为userRepository"的 bean 时出错:自动装配依赖项的注入失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 org.hibernate.SessionFactory com.mobiusinversion.web.repositories.UserRepository.sessionFactory;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在 com.mobiusinversion.web.spring.Config 类中定义的名称为getSessionFactory"的 bean 创建时出错:调用 init 方法失败;嵌套异常是 org.hibernate.service.spi.ServiceException:无法创建请求的服务 [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider]在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700)在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)在 org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)在 org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:530)在 org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)在 org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)

在许多堆栈跟踪之后包含

造成的:java.lang.ClassCastException: org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider 无法转换为 org.hibernate.engine.jdbc.connections.spi.ConnectionProvider在 org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider(ConnectionProviderInitiator.java:194)在 org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:120)在 org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:55)在 org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:83)在 org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:223)在 org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:197)在 org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:178)在 org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260)在 org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94)在 org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:89)在 org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:206)在 org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:178)在 org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885)在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843)在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1928)

由于这里发生了很多事情,并且堆栈跟踪很长,所以请您在寻找可能的解决方案时亲自尝试这段代码.代码简单,自包含,只需要maven和合适的服务器即可.

https://github.com/mobiusinversion/SpringMVCWebApp

帮助完成这项工作将不胜感激.似乎每个堆栈跟踪的解决方案都会导致另一种方式.让我们回顾一下我们在这里尝试做的事情:

基于注解的spring bean配置基于注解的休眠配置

应该很简单吧?

[UPDATE 4/4/14 4pm] 问题现在是由于没有会话绑定到线程导致的 HibernateException:

造成的:org.hibernate.HibernateException: 找不到当前线程的会话在 org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106)在 org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)在 com.mobiusinversion.web.repositories.UserRepository.createUser(UserRepository.java:26)在 com.mobiusinversion.web.services.UserService.createUser(UserService.java:21)在 com.mobiusinversion.web.controllers.BasicController.createUser(BasicController.java:28)在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在 java.lang.reflect.Method.invoke(Method.java:606)在 org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)在 javax.servlet.http.HttpServlet.service(HttpServlet.java:687)在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)在 javax.servlet.http.HttpServlet.service(HttpServlet.java:790)在 org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:717)在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1644)在 org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:164)在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1615)在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550)在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)在 org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:568)在 org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221)在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1110)在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:479)在 org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183)在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1044)在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)在 org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:199)在 org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)在 org.eclipse.jetty.server.Server.handle(Server.java:459)在 org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:281)在 org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:232)在 org.eclipse.jetty.io.AbstractConnection$1.run(AbstractConnection.java:505)在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607)在 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536)在 java.lang.Thread.run(Thread.java:744)

在合并了几条好的建议之后,这里是 spring 配置中的会话 bean 构造:

@Bean公共 LocalSessionFactoryBean getSessionFactory() {LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();localSessionFactoryBean.setDataSource(getDataSource());localSessionFactoryBean.setHibernateProperties(getHibernateProperties());localSessionFactoryBean.setPackagesToScan("com.mobiusinversion.web");返回 localSessionFactoryBean;}

这里是错误发生的地方.

@Transactional@Repository公共类 UserRepository {@自动连线私人会话工厂会话工厂;@SuppressWarnings("未选中")公共整数创建用户(用户用户){用户合并用户 = (用户) sessionFactory.getCurrentSession().merge(user);返回mergedUser.getId();}}
解决方案

基于此命令行 重叠 jars 报告(我做的一个工具),WAR的WEB-INF/lib中有两个hibernate版本:

>>>>罐子重叠报告:hibernate-3.1.jar 与 hibernate-core-4.3.4.Final.jar 重叠 -总重叠类:494jboss-transaction-api_1.2_spec-1.0.0.Final.jar 与 jta-1.0.1B.jar 重叠 -总重叠类:17具有多个版本的类总数:511

在带有 mvn dependency:tree 的 POM 中进一步查看我们可以看到重复项的来源:

[INFO] +- org.hibernate:hibernate-core:jar:4.3.4.Final:compile...[信息] +- org.hibernate:hibernate:jar:3.1:compile

在这种情况下,类路径中添加了两个版本的 hibernate,因为 hibernate 用不同的工件名称声明了两次.对此的解决方案是只选择一个版本的 Hibernate,从 POM 中删除另一个版本.最好选择 4.3.4.Final,因为 3.1 非常古老.

I am working on a Spring webapp using annotations and Hibernate. One of the goals here is that the application be annotation driven (instead of XML) for all elements of the stack, which right now is just spring and hibernate. Every solution from this and other questions I asked here about this code leads to a whack a mole style conflagration of issues, but this cant be that hard. Please try this code! It's much easier than us all going through a point by point exposition of stack traces.

A Github link is included, just git clone, maven clean package, and deploy to a suitable server such as Jetty, you can see all these traces in action.

Here is how this started: when firing up a webapp I got the following no class def found error:

java.lang.noclassdeffounderror L[org.hibernate.engine.FilterDefinition

I am using Hibernate 4.3.4

<hibernate.version>4.3.4.Final</hibernate.version>

and am using the core jar

    <!-- Hibernate -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

Here was the trace

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.mobiusinversion.web.repositories.UserRepository com.mobiusinversion.web.services.UserService.userRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.mobiusinversion.web.repositories.UserRepository.sessionFactory; nested exception is java.lang.NoClassDefFoundError: [Lorg/hibernate/engine/FilterDefinition;
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:530)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
at javax.servlet.GenericServlet.init(GenericServlet.java:244)

Now searching maven central, I see that class is in Hibernate 3.1, so now I've added that to my pom

    <!-- Hibernate -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate4.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate</artifactId>
        <version>${hibernate3.version}</version>
    </dependency>

Along with the following required repository (which was a undocumented requirement, GROWL)

<repositories>
    <repository>
        <id>java.net</id>
        <url>http://download.java.net/maven/2/</url>
    </repository>
</repositories>

However this leads to the following trace

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.mobiusinversion.web.repositories.UserRepository com.mobiusinversion.web.services.UserService.userRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.mobiusinversion.web.repositories.UserRepository.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getSessionFactory' defined in class com.mobiusinversion.web.spring.Config: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:530)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)

Which after a number of stack traces contains

Caused by: 
java.lang.ClassCastException: org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider cannot be cast to org.hibernate.engine.jdbc.connections.spi.ConnectionProvider
at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.instantiateExplicitConnectionProvider(ConnectionProviderInitiator.java:194)
at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:120)
at org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator.initiateService(ConnectionProviderInitiator.java:55)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:83)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:223)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:197)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:178)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:89)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:206)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:178)
at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1928)

Since there is a lot going on here, and Stack traces get long, please, I ask you to try this code for yourself when looking at a possible solution. The code is simple, self contained, and only requires maven and a suitable server.

https://github.com/mobiusinversion/SpringMVCWebApp

Help getting this working would be greatly appreciated. It just seems like every solution to ever stack trace leads to another in whack a mole fashion. Lets recap what we are try to do here:

Annotation based spring bean configurationAnnotation based hibernate configuration

Should be simple, right?

[UPDATE 4/4/14 4pm] The issue is now a HibernateException casue by no session bound to thread:

Caused by: 
org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
at com.mobiusinversion.web.repositories.UserRepository.createUser(UserRepository.java:26)
at com.mobiusinversion.web.services.UserService.createUser(UserService.java:21)
at com.mobiusinversion.web.controllers.BasicController.createUser(BasicController.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:717)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1644)
at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:164)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1615)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:568)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1110)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:479)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1044)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:199)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:459)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:281)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:232)
at org.eclipse.jetty.io.AbstractConnection$1.run(AbstractConnection.java:505)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536)
at java.lang.Thread.run(Thread.java:744)

After incorporating several good pieces of advice, here is the session bean construction in the spring config:

@Bean
public LocalSessionFactoryBean getSessionFactory() {
    LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
    localSessionFactoryBean.setDataSource(getDataSource());
    localSessionFactoryBean.setHibernateProperties(getHibernateProperties());
    localSessionFactoryBean.setPackagesToScan("com.mobiusinversion.web");
    return localSessionFactoryBean;
}

And here is where the error occurs.

@Transactional
@Repository
public class UserRepository {

    @Autowired
    private SessionFactory sessionFactory;

    @SuppressWarnings("unchecked")
    public Integer createUser(User user) {
        User mergedUser = (User) sessionFactory.getCurrentSession().merge(user);
        return mergedUser.getId();
    }
}
解决方案

Based on this command line overlapping jars report (a tool I made), there are two hibernate versions in WEB-INF/lib of the WAR:

>>>> Jar overlap report: 

hibernate-3.1.jar overlaps with hibernate-core-4.3.4.Final.jar - 
total overlapping classes: 494
jboss-transaction-api_1.2_spec-1.0.0.Final.jar overlaps with jta-1.0.1B.jar - 
total overlapping classes: 17

Total number of classes with more than one version: 511

Looking further in the POM with mvn dependency:tree we can see where the duplicates come from:

[INFO] +- org.hibernate:hibernate-core:jar:4.3.4.Final:compile
...
[INFO] +- org.hibernate:hibernate:jar:3.1:compile

In this case there are two versions of hibernate added in the classpath, as hibernate is declared twice with different artifact names. The solution for this is to choose only one version of Hibernate, removing the other from the POM. The best would be to choose 4.3.4.Final because 3.1 is very ancient.

这篇关于Spring Webapp with Hibernate, Annotation Driven, Issue after Issue, Source Code Link的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-21 00:30