org.hibernate.HibernateException: No Session found for attachcurrentthread thread

所有回答(1)
你有在Hibernate主配置文件中设置&
&property name="hibernate.current_session_context_class"&thread&/property&
这个属性?
空指针依然么,明显是属性没有注入,你调用了肯定空指针了。
&&&您需要以后才能回答,未注册用户请先。当前位置: >
> org.hibernate.HibernateException: No Session found for current thread解决办法
org.hibernate.HibernateException: No Session found for current thread解决办法
xiaolang32777 & at
org.hibernate.HibernateException: No Session found for current thread这是applicationContext.xml
& xml&version="1.0"&encoding="UTF-8" &
xmlns:xsi=""
&&&&xmlns:tx=""
&&&&xmlns:aop=""&
xmlns:p=""
xsi:schemaLocation=";&
&&&&&&&&&&&&&&&&&&&&&&&&&&&;
&&&&&&&&&&&&&&&&&&&&&&&&&&&;&
&&&&&&&&&&&&&&&&&&&&&&&&&&&;
&&&&&&&&&&&&&&&&&&&&&&&&&&&;&
&&&&&&&&&&&&&&&&&&&&&&&&&&&"&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&!--&数据元配置&--&
&bean&id="dataSource"&class="ormons.dbcp.BasicDataSource"&
&&&property&name="driverClassName"&value="com.mysql.jdbc.Driver"$>$/property&
&&&property&name="url"&value="jdbc:mysql://localhost:3306/callsystem"$>$/property&
&&&property&name="username"&value="root"$>$/property&
&&&property&name="password"&value="jv"$>$/property& &&
&bean&id="sessionFactory"&class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"&
&&&property&name="dataSource"&ref="dataSource"$>$/property&
&&&property&name="mappingResources"&
&&&&&list&
&&&&&&&value&/hbm/xml/Group/user.hbm.xml&/value&
&&&&&&&value&/hbm/xml/Group/userMap.hbm.xml&/value&
&&&&&&&value&/hbm/xml/Group/set_meal.hbm.xml&/value&
&&&&&&&value&/hbm/xml/Group/card.hbm.xml&/value&
&&&&&&&value&/hbm/xml/Group/history.hbm.xml&/value&
&&&&&&&value&/hbm/xml/Group/action.hbm.xml&/value&
&&&&&/list&
&&&/property&
&&&property&name="hibernateProperties"&
&&&&&props&
&&&&&&&prop&key="hibernate.dialect"&org.hibernate.dialect.MySQLDialect&/prop&
&&&&&&&!--&&prop&key="hibernate.hbm2ddl.auto"&update&/prop$>$--&
&&&&&&&prop&key="hibernate.show_sql"&false&/prop&
&&&&&&&prop&key="hibernate.format_sql"&true&/prop&
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-人气:2115835
访问用户量:3099
笔记经验:3830
总积分:261644
级别:VIP5
搜索本笔记
ta的交流分类
ta的全部笔记
浏览(79243)|(36)
&&交流分类:|笔记分类:
=============广告==============================&
私塾在线独家Spring3开发实战视频活动促销
私塾在线老师出品,品质值得信赖
还有免费课程:
=============广告==============================
一 开发环境
1、动态web工程
2、部分依赖
java代码:
hibernate-release-4.1.0.Final.zip
hibernate-validator-4.2.0.Final.jar
spring-framework-3.1.1.RELEASE-with-docs.zip
proxool-0.9.1.jar
log4j 1.2.16
slf4j -1.6.1
mysql-connector-java-5.1.10.jar
hamcrest 1.3.0RC2
ehcache 2.4.3
3、为了方便学习,暂没有使用maven构建工程
二 工程主要包括内容
1、springMVC + spring3.1.1 + hibernate4.1.0集成
2、通用DAO层 和 Service层
3、二级缓存 Ehcache
4、REST风格的表现层
5、通用分页(两个版本)
5.1、首页 上一页,下一页 尾页 跳转
5.2、上一页 1 2 3 4 5 下一页
6、数据库连接池采用proxool
7、spring集成测试 &&&
8、表现层的 java validator框架验证(采用hibernate-validator-4.2.0实现)
9、视图采用JSP,并进行组件化分离
三 TODO LIST& 将本项目做成脚手架方便以后新项目查询
1、Service层进行AOP缓存(缓存使用Memcached实现)
2、单元测试(把常见的桩测试、伪实现、模拟对象演示一遍 区别集成测试)
3、监控功能
后台查询hibernate二级缓存 hit/miss率功能&&&&&&
& &后台查询当前服务器状态功能(如 线程信息、服务器相关信息)
4、spring RPC功能
5、spring集成 quartz 进行任务调度
6、spring集成 java mail进行邮件发送
7、DAO层将各种常用框架集成进来(方便查询)
8、把工作中经常用的东西 融合进去,作为脚手架,方便以后查询
四 集成重点及常见问题
1、spring-config.xml 配置文件:
1.1、该配置文件只加载除表现层之外的所有bean,因此需要如下配置:
java代码:
&context:component-scan base-package=&cn.javass&&
&context:exclude-filter type=&annotation& expression=&org.springframework.stereotype.Controller&/&
&/context:component-scan&
通过exclude-filter 把所有 @Controller注解的表现层控制器组件排除
1.2、国际化消息文件配置
java代码:
&!-- 国际化的消息资源文件 --&
&bean id=&messageSource& class=&org.springframework.context.support.ReloadableResourceBundleMessageSource&&
&property name=&basenames&&
&!-- 在web环境中一定要定位到classpath 否则默认到当前web应用下找
&value&classpath:messages&/value&
&/property&
&property name=&defaultEncoding& value=&UTF-8&/&
&property name=&cacheSeconds& value=&60&/&
此处basenames内一定是 classpath:messages ,如果你写出“messages”,将会到你的web应用的根下找 即你的messages.properties一定在 web应用/messages.propertis。
1.3、hibernate的sessionFactory配置 需要使用org.springframework.orm.hibernate4.LocalSessionFactoryBean,其他都是类似的,具体看源代码。
1.4、&aop:aspectj-autoproxy expose-proxy=&true&/& 实现@AspectJ注解的,默认使用AnnotationAwareAspectJAutoProxyCreator进行AOP代理,它是BeanPostProcessor的子类,在容器启动时Bean初始化开始和结束时调用进行AOP代理的创建,因此只对当容器启动时有效,使用时注意此处。
1.5、声明式容器管理事务
建议使用声明式容器管理事务,而不建议使用注解容器管理事务(虽然简单),但太分布式了,采用声明式容器管理事务一般只对service层进行处理。
java代码:
&tx:advice id=&txAdvice& transaction-manager=&txManager&&
&tx:attributes&
&tx:method name=&save*& propagation=&REQUIRED& /&
&tx:method name=&add*& propagation=&REQUIRED& /&
&tx:method name=&create*& propagation=&REQUIRED& /&
&tx:method name=&insert*& propagation=&REQUIRED& /&
&tx:method name=&update*& propagation=&REQUIRED& /&
&tx:method name=&merge*& propagation=&REQUIRED& /&
&tx:method name=&del*& propagation=&REQUIRED& /&
&tx:method name=&remove*& propagation=&REQUIRED& /&
&tx:method name=&put*& propagation=&REQUIRED& /&
&tx:method name=&use*& propagation=&REQUIRED&/&
&!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到--&
&tx:method name=&get*& propagation=&REQUIRED& read-only=&true& /&
&tx:method name=&count*& propagation=&REQUIRED& read-only=&true& /&
&tx:method name=&find*& propagation=&REQUIRED& read-only=&true& /&
&tx:method name=&list*& propagation=&REQUIRED& read-only=&true& /&
&tx:method name=&*& read-only=&true& /&
&/tx:attributes&
&/tx:advice&
&aop:config expose-proxy=&true&&
&!-- 只对业务逻辑层实施事务 --&
&aop:pointcut id=&txPointcut& expression=&execution(* cn.javass..service..*.*(..))& /&
&aop:advisor advice-ref=&txAdvice& pointcut-ref=&txPointcut&/&
&/aop:config&
此处一定注意 使用 hibernate4,在不使用OpenSessionInView模式时,在使用getCurrentSession()时会有如下问题:
当有一个方法list 传播行为为Supports,当在另一个方法getPage()(无事务)调用list方法时会抛出org.hibernate.HibernateException: No Session found for current thread 异常。
这是因为getCurrentSession()在没有session的情况下不会自动创建一个,不知道这是不是Spring3.1实现的bug,欢迎大家讨论下。
因此最好的解决方案是使用REQUIRED的传播行为。
二、spring-servlet.xml:
2.1、表现层配置文件,只应加装表现层Bean,否则可能引起问题。
java代码:
&!-- 开启controller注解支持 --&
&!-- 注:如果base-package=cn.javass 则注解事务不起作用--&
&context:component-scan base-package=&cn.javass.demo.web.controller&&
&context:include-filter type=&annotation& expression=&org.springframework.stereotype.Controller&/&
&/context:component-scan&
此处只应该加载表现层组件,如果此处还加载dao层或service层的bean会将之前容器加载的替换掉,而且此处不会进行AOP织入,所以会造成AOP失效问题(如事务不起作用),再回头看我们的1.4讨论的。
2.2、&mvc:view-controller path=&/& view-name=&forward:/index&/& 表示当访问主页时自动转发到index控制器。
2.3、静态资源映射
java代码:
&!-- 当在web.xml 中
DispatcherServlet使用
&url-pattern&/&/url-pattern& 映射时,能映射静态资源 --&
&mvc:default-servlet-handler/&
&!-- 静态资源映射 --&
&mvc:resources mapping=&/images/**& location=&/WEB-INF/images/& /&
&mvc:resources mapping=&/css/**& location=&/WEB-INF/css/& /&
&mvc:resources mapping=&/js/**& location=&/WEB-INF/js/& /&
以上是配置文件部分,接下来来看具体代码。
三、通用DAO层Hibernate4实现
为了减少各模块实现的代码量,实际工作时都会有通用DAO层实现,以下是部分核心代码:
java代码:
public abstract class BaseHibernateDao&M extends java.io.Serializable, PK extends java.io.Serializable& implements IBaseDao&M, PK& {
protected static final Logger LOGGER = LoggerFactory.getLogger(BaseHibernateDao.class);
private final Class&M& entityC
private final String HQL_LIST_ALL;
private final String HQL_COUNT_ALL;
private final String HQL_OPTIMIZE_PRE_LIST_ALL;
private final String HQL_OPTIMIZE_NEXT_LIST_ALL;
private String pkName =
@SuppressWarnings(&unchecked&)
public BaseHibernateDao() {
this.entityClass = (Class&M&) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Field[] fields = this.entityClass.getDeclaredFields();
for(Field f : fields) {
if(f.isAnnotationPresent(Id.class)) {
this.pkName = f.getName();
Assert.notNull(pkName);
//TODO @Entity name not null
HQL_LIST_ALL = &from & + this.entityClass.getSimpleName() + & order by & + pkName + & desc&;
HQL_OPTIMIZE_PRE_LIST_ALL = &from & + this.entityClass.getSimpleName() + & where & + pkName + & & ? order by & + pkName + & asc&;
HQL_OPTIMIZE_NEXT_LIST_ALL = &from & + this.entityClass.getSimpleName() + & where & + pkName + & & ? order by & + pkName + & desc&;
HQL_COUNT_ALL = & select count(*) from & + this.entityClass.getSimpleName();
@Autowired
@Qualifier(&sessionFactory&)
private SessionFactory sessionF
public Session getSession() {
//事务必须是开启的,否则获取不到
return sessionFactory.getCurrentSession();
Spring3.1集成Hibernate4不再需要HibernateDaoSupport和HibernateTemplate了,直接使用原生API即可。
四、通用Service层代码 此处省略,看源代码,有了通用代码后CURD就不用再写了。
java代码:
@Service(&UserService&)
public class UserServiceImpl extends BaseService&UserModel, Integer& implements UserService {
private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class);
private UserDao userD
@Autowired
@Qualifier(&UserDao&)
public void setBaseDao(IBaseDao&UserModel, Integer& userDao) {
this.baseDao = userD
this.userDao = (UserDao) userD
public Page&UserModel& query(int pn, int pageSize, UserQueryModel command) {
return PageUtil.getPage(userDao.countQuery(command) ,pn, userDao.query(pn, pageSize, command), pageSize);
五、表现层 Controller实现
采用SpringMVC支持的REST风格实现,具体看代码,此处我们使用了java Validator框架 来进行 表现层数据验证
在Model实现上加验证注解
java代码:
@Pattern(regexp = &[A-Za-z0-9]{5,20}&, message = &{username.illegal}&) //java validator验证(用户名字母数字组成,长度为5-10)
@NotEmpty(message = &{email.illegal}&)
@Email(message = &{email.illegal}&) //错误消息会自动到MessageSource中查找
@Pattern(regexp = &[A-Za-z0-9]{5,20}&, message = &{password.illegal}&)
@DateFormat( message=&{register.date.error}&)//自定义的验证器
private Date registerD
在Controller中相应方法的需要验证的参数上加@Valid即可
java代码:
@RequestMapping(value = &/user/add&, method = {RequestMethod.POST})
public String add(Model model, @ModelAttribute(&command&) @Valid UserModel command, BindingResult result)
六、Spring集成测试
使用Spring集成测试能很方便的进行Bean的测试,而且使用@TransactionConfiguration(transactionManager = &txManager&, defaultRollback = true)能自动回滚事务,清理测试前后状态。
java代码:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {&classpath:spring-config.xml&})
@Transactional
@TransactionConfiguration(transactionManager = &txManager&, defaultRollback = true)
public class UserServiceTest {
AtomicInteger counter = new AtomicInteger();
@Autowired
private UserService userS
其他部分请直接看源码,欢迎大家讨论。
补充spring3.1.1源代码分析当 传播行为为 Support时报&org.hibernate.HibernateException: No Session found for current thread 异常:
spring3.1开始 不提供(没有这个东西了)Hibernate4的 DaoSupport和Template,,而是直接使用原生的Hibernate4 API&
如在 Hibernate3中 HibernateTemplate中有如下代码&
protected&Session&getSession()&{&&
&&&&&&&&if&(isAlwaysUseNewSession())&{&&
&&&&&&&&&&&&return&SessionFactoryUtils.getNewSession(getSessionFactory(),&getEntityInterceptor());&&
&&&&&&&&}&&
&&&&&&&&else&if&(isAllowCreate())&{&&
&&&&&&&&&&&&return&SessionFactoryUtils.getSession(&&
&&&&&&&&&&&&&&&&&&&&getSessionFactory(),&getEntityInterceptor(),&getJdbcExceptionTranslator());&&
&&&&&&&&}&&
&&&&&&&&else&if&(SessionFactoryUtils.hasTransactionalSession(getSessionFactory()))&{&&
&&&&&&&&&&&&return&SessionFactoryUtils.getSession(getSessionFactory(),&false);&&
&&&&&&&&}&&
&&&&&&&&else&{&&
&&&&&&&&&&&&try&{&&
&&&&&&&&&&&&&&&&return&getSessionFactory().getCurrentSession();&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&catch&(HibernateException&ex)&{&&
&&&&&&&&&&&&&&&&throw&new&DataAccessResourceFailureException(&Could&not&obtain&current&Hibernate&Session&,&ex);&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
但我们使用的是Hibernate4原生API,使用SpringSessionContext获取session,而这个isAllowCreate选项默认为false&
public&Session&currentSession()&throws&HibernateException&{&&
&&&&try&{&&
&&&&&&&&return&(org.hibernate.classic.Session)&SessionFactoryUtils.doGetSession(this.sessionFactory,&false);&&
&&&&catch&(IllegalStateException&ex)&{&&
&&&&&&&&throw&new&HibernateException(ex.getMessage());&&
SessionFactoryUtils类&
public&static&Session&doGetSession(SessionFactory&sessionFactory,&boolean&allowCreate)&&
&&&&&&&&throws&HibernateException,&IllegalStateException&{&&
&&&&return&doGetSession(sessionFactory,&null,&null,&allowCreate);&&
可否认为这是集成Hibernate4的bug,或者采用OpenSessionInView模式解决或使用Required传播行为。
原创内容,转载请注明私塾在线【】
相关笔记推荐
精品视频课程推荐
JUnit4的基本使用;在maven环境下使用JUnit;用JMock来模拟测试对象要依赖的对象;用cobertura实现覆盖测试;用hundson实现持续集成;JUnit3的基本使用。
本视频课程是北京Java私塾原创精品书籍《研磨设计模式》一书的配套学习视频,由《研磨设计模式》的第一作者CC录制
课程目标:全面、系统的掌握GoF设计模式的知识,达到可以在实际项目开发中运用的能力
技术要点:如何实现可配置、如何实现缓存以及缓存的管理、如何实现用缓存来控制多实例的创建、如何实现参数化工厂、 如何实现可扩展工厂、如何实现原型管理器、如何实现Java的静态代理和动态代理、如何实现多线程处理队列请求、 如何实现命令的参数化配置、可撤销的操作、宏命令、队列请求和日志请求、如何实现翻页迭代、如何检测环状结构、 如何实现通用的增删改查、如何模拟工作流来处理流程、如何实现简单又通用的XML读取、如何实现模拟AOP的功能......
WebLogic基础知识:WebLogic基本概念、正确安装WebLogic、建域、应用部署于JDBC选择、对WebLogic的监控和日志查看、集群的高可用性;课程目标:彻底掌握WebLogic的基本概念,在理解基本概念的基础上做到正确的安装WebLogic,根据不同的需求创建域,合理选择应用部署和JDBC配置。熟练掌握WebLogic的console监控,了解各种性能和运行指标,以及对监控结果的分析,运用集群的高可用性,对集群架设。
内容概述:Shiro是目前最热门、最易用、功能超强大的Java权限管理框架,强烈推荐,每个项目都必备的权限管理技术!通过本课程,你将从零开始直到彻底掌握Shiro的相关开发知识,达到可以进行实际项目开发的能力。包括:权限管理基础、Shiro入门、配置、身份认证、授权、Realms、Session管理、和Spring的集成、Web、Cache等众多开发细节技术
技术要点:源码级分析Shiro的授权过程、自定义开发Realm、多个Realms的开发配置、自定义开发AuthenticationStrategy、自定义开发自定义SessionDAO、和Struts2+Spring3的集成(包括修正struts2的bug)、Shiro和SpringMVC+Spring3的集成、包装使用其他的Cache框架、缓存数据同步更新的解决方案等等实际开发中常用的内容
达到能综合使用Struts2+Spring3+Hibernate3+Jbpm4来进行实际项目开发的能力。
包括:ssh和jbpm的整合;数据字典;通用DAO(Spring+Hibernate+泛型+反射+SpEL+模板方法模式);自动生成UUID的加强版;分层开发、SSH联合的基本开发;翻页的示范真实值和表现值,数据参照的实现;文件上传下载;主子表操;登录验证码;登录控制的拦截器
浏览(79243)|(36)
&&交流分类:|笔记分类:
非常好,感谢无私的分享,解决了大问题了
张老师好:
我有一个问题我不太清楚,有很多类都没有用到:ICommonDao,ICommonDao,ICommonService,CommonService,CommonHibernateDao。这些类在项目中有什么作用呢?
&同问,请张老师抽空解答一下。
张老师你好,sessionFactory 注入失败怎么解决的啊?找了好些资料hibernate4都有这个问题,下了你的例子也是报这个错误的。请指教指教,谢谢!
错误信息:Error creating bean with name 'CommonHibernateDao': Injection of autowired nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory mon.monHibernateDao.sessionF nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [spring-config.xml]: Invocation o nested exception is java.lang.NullPointerException
下载下来看看
开涛老师 , 提供一个访问这个项目的地址吧?
我初学还没几天,想学习学习您写的东西.
不错,学习中
The method list(String, Object[]) is ambiguous for the type BaseHibernateDao&M,PK&
LINE & &126 &132 135 &142 144 &报错 &请老师解答
The method list(String, Object[]) is ambiguous for the type BaseHibernateDao&M,PK&
编译报错 & 用的是JDK7 64位的 & 请老师指点&
在朋友的86的系统上 一切正常 &求解
张老师好:
我有一个问题我不太清楚,有很多类都没有用到:ICommonDao,ICommonDao,ICommonService,CommonService,CommonHibernateDao。这些类在项目中有什么作用呢?
张老师好:
我有一个问题我不太清楚,有很多类都没有用到:ICommonDao,ICommonDao,ICommonService,CommonService,CommonHibernateDao。这些类在项目中有什么作用呢?
proxool.maximum.connection.count 有问题 检查下
张老师,请问一下。我把你提供的源码中数据库密码改了,但启动tomcat报错,不知道还需要修改哪些地方
13:23:14 [main] ERROR org.springframework.web.context.ContextLoader - Context initialization failedorg.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in class path resource [spring-config.xml]: Could not resolve placeholder 'proxool.maximum.connection.count'&at org.springframework.beans.factory.config.PlaceholderConfigurerSupport.doProcessProperties(PlaceholderConfigurerSupport.java:209)&at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:220)&at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:84)&at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:681)&at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:656)&at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:446)&at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)&at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284)&at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)&at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)&at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)&at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)&at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)&at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)&at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)&at org.apache.catalina.core.StandardService.start(StandardService.java:516)&at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)&at org.apa
BaseHibernateDao 文件报错,list方法缺少参数?
The method list(String, Object[]) is ambiguous for the type BaseHibernateDao&M,PK&
写的非常好
版权所有 Copyright(C) 私塾在线学习网}

我要回帖

更多关于 getcurrentsession 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信