论坛首页 Java企业应用论坛

最新SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结

浏览 177329 次
该帖已经被评为精华帖
作者 正文
   发表时间:2012-02-29   最后修改:2012-02-29
既然使用到了hibernate 楼主就把JPA加进去吧。springmvc spring jpa hibernate。
并且就不要提供建库脚本了,直接自动建库。

把楼主的源码下载下来了,在jetty服务器上运行不起来。启动也不报错,
0 请登录后投票
   发表时间:2012-02-29  
maoweiwer 写道
既然使用到了hibernate 楼主就把JPA加进去吧。springmvc spring jpa hibernate。
并且就不要提供建库脚本了,直接自动建库。



可以加

习惯了 自己手写脚本
0 请登录后投票
   发表时间:2012-02-29  
黄浦江 写道
web.xml 的后一个web-app_2_4 改成web-app_2_5即可   当然  这是我电脑的环境


搞定了吗
0 请登录后投票
   发表时间:2012-02-29  
搞定了  谢谢啊  我紧接着在后面不是说了么  呵呵  将后一个web-app_2_4 改成web-app_2_5即可
0 请登录后投票
   发表时间:2012-02-29  
建议,Spring Data JPA不错,SpringSide已经换它了:)
0 请登录后投票
   发表时间:2012-03-01   最后修改:2012-03-01
江南白衣 写道
建议,Spring Data JPA不错,SpringSide已经换它了:)


Spring Data系列的,我回头看看,谢谢。


另外请教您个问题: 当使用Spring3.1.x 集成 hibernate4.x时,  再不使用OpenSessionInView模式下,Supports等自己不打开事务的传播行为 会报错: org.hibernate.HibernateException: No Session found for current thread 异常。


我仔细看了源代码: 在Hibernate3情况下 因为使用HibernateTemplate 它里面默认没有session时打开一个,而Hibernate4时 就不再默认打开一个。 也就是说在hibernate4要么使用Required或RequiredNew 或者OpenSessionInView。

代码如下:

在 Hibernate3中 HibernateTemplate中有如下代码

protected Session getSession() {  
        if (isAlwaysUseNewSession()) {  
            return SessionFactoryUtils.getNewSession(getSessionFactory(), getEntityInterceptor());  
        }  
        else if (isAllowCreate()) {//默认是true,也就是即使你的传播行为是Supports也一定会有session存在的 
            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

/** 
 * Retrieve the Spring-managed Session for the current thread, if any. 
 */  
public Session currentSession() throws HibernateException {  
    try {  
        return (org.hibernate.classic.Session) SessionFactoryUtils.doGetSession(this.sessionFactory, false);//最后的false即是 allowCreate值
    }  
    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);  
}  
0 请登录后投票
   发表时间:2012-03-01  
我还木有使用H4,而且也一直都是用原生API的,好久没碰过HibernateTemplate
0 请登录后投票
   发表时间:2012-03-01  
江南白衣 写道
我还木有使用H4,而且也一直都是用原生API的,好久没碰过HibernateTemplate

HibernateTemplate 已经被废弃了... 不推荐使用...
0 请登录后投票
   发表时间:2012-03-01  
江南白衣 写道
我还木有使用H4,而且也一直都是用原生API的,好久没碰过HibernateTemplate


hibernate4这种 情况 应该算是bug吧!
0 请登录后投票
   发表时间:2012-03-01  
sodart 写道
江南白衣 写道
我还木有使用H4,而且也一直都是用原生API的,好久没碰过HibernateTemplate

HibernateTemplate 已经被废弃了... 不推荐使用...


spring3集成 Hibernate4 根本就没有提供HibernateTemplate
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics