日期:2014-05-20  浏览次数:20783 次

在线等:求救如何解决:don't flush the Session after an exception occurs的方法
更新多条记录出错:Hibernate.在线等....
试图在一个Action中调用多次Hibernate插入数据,
因为插入前一条数据后在后一条插入数据中需要用到前一条的记录.
代码如下:

Java code

    public ActionForward regUser(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        UserActionForm uaf = (UserActionForm)form;
        //取出从页面提交过来的数据
        String name = uaf.getName();
        String password = uaf.getPassword();
        String password1 = uaf.getPassword1();
        String nichen = uaf.getNichen();
        String email = uaf.getEmail();
        String province = uaf.getProvince();
        String sex = request.getParameter("sex");
        MD5 md5 = new MD5();
        //将页面提交过来的数据设置进User类中
        User user = new User();
        user.setName(name);
        user.setEmail(email);
        user.setPassword(md5.getMD5ofStr(password));
        user.setNichen(nichen);
        user.setSex(sex);
        user.setProvince(province);
        user.setRegTime(new java.sql.Timestamp(System.currentTimeMillis()));
        //调用业务逻辑方法
        int flag = 0;
        try {
            flag = userManager.add_User(user);
        }catch(Exception e){
            e.printStackTrace();
            return mapping.findForward("add_fail");
        }
        
        /**
         * 默认的方法是开通博客同时是发表一篇开通博客的日志.
         */
        Blog blog = new Blog();
        blog.setName(name);
        blog.setVisited(1);
        blog.setGrade(1);
        blog.setOnline(true);
        blog.setUser(user);
        blog.setLastLoginTime(new java.sql.Timestamp(System.currentTimeMillis()));
        blog.setMingyuan("OpenSource社区博客中心欢迎你");
        blog.setHead(null);
        
        /**
         * 发表一篇开通博客的日志...
         */
        Daily daily = new Daily();
        daily.setTitle("用户"+user.getName()+"开通博客--"+name);
        daily.setContent("<font size='4'><p>感谢用户:<font color='white' size='3'>"+user.getName()+"</font>在OpenSource开源社区中心开通博客</p>" +
                "<p>若有任何问题及意见,请发邮件到*****@163.com或者致电到:*****或者QQ交谈:******</p>" +
                "<p>如果发生问题,我们会尽快帮你解决你所提出的问题,你的意见及问题是我们开源社区前进的动力!</p>"+
                "<p>谢谢你的合作!</p></font><p align='right'>开发团队PPP敬上!</p>");
        daily.setVisited(0);
        daily.setPostTime(new java.sql.Timestamp(System.currentTimeMillis()));
        int flag2 = 0;
        try {
            flag2 = blogManager.add_Blog(blog);
        }catch(Exception e){
            e.printStackTrace();
            return mapping.findForward("add_fail");
        }
        daily.setBlog(blog);
        try {
            dailyManager.add_Daily(daily);
        }catch(Exception e){
            e.printStackTrace();
            return mapping.findForward("add_fail");
        }
        if(flag==1 && flag2==1){
            return mapping.findForward("add_success");
        }else {
            return mapping.findForward("add_fail");
        }
    }
    



出错如下:
Java code

javax.servlet.ServletException: org.hibernate.AssertionFailure: null id in com.hpjianhua.xiehui.model.User entry (don't flush the Session after an exception occurs)
    org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:78)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)


root cause 

org.hibernate.AssertionFailure: null id in com.hpjianhua.xiehui.model.User entry (don't flush the Session after an exception occurs)
    org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:55)
    org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:157)
    org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:113)
    org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196)
    org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
    org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
    org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:558)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:540)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:510)
    org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:310)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:117)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:209)
    $Proxy24.add_User(Unknown Source)
    com.hpjianhua.xiehui.web.action.UserAction.regUser(UserAction.java:52)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
    org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
    com.hpjianhua.xiehui.web.action.BaseAction.execute(BaseAction.java:18)
    org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:106)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:78)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)


note The full stack trace of the root cause is available in the Apache Tomcat/6.0.16 logs.