`
hpjianhua
  • 浏览: 240923 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类

don't flush the Session after an exception occurs

 
阅读更多
更新多条记录出错:Hibernate.
试图在一个Action中调用多次Hibernate插入数据,
因为插入前一条数据后在后一条插入数据中需要用到前一条的记录.
代码如下:
   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");
        }
    }
    



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.


分享到:
评论
3 楼 hpjianhua 2010-04-30  
看看兄弟写的Action代码是如何的呢?谢谢了
2 楼 rainlife 2010-04-30  
>>因为插入前一条数据后在后一条插入数据中需要用到前一条的记录
先去了解一下hibernate的基础知识吧

-----------------------------------
Action的代码,简直惨不忍睹
1 楼 hpjianhua 2010-04-30  
请问解决方法....谢谢了..

相关推荐

    hibernate的session.flush

    `Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的一致性。这篇博客深入探讨了`Session.flush()`的工作原理和应用场景。 `Session`在Hibernate中主要有以下职责...

    Hibernate的事务处理机制和flush方法的用法.docx

    在使用Hibernate进行数据库操作时,事务管理和`flush`方法的正确使用至关重要,因为它们直接影响到数据的一致性和安全性。在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些...

    hibernate的flush机制

    4. **关闭Session**:当Session被关闭时,Hibernate会自动执行Flush操作,以确保所有未提交的更改都被持久化到数据库中。 #### 错误示例分析 在给定的部分内容中,提到了一个典型的错误场景,其中包含了一个常见的...

    hibernate的flush()、refresh()、clear()针对一级缓存的操作的区别.docx

    1. `session.flush()`: 这个方法的主要作用是将Session缓存中的改动同步到数据库中。在默认情况下,Hibernate并不会立即更新数据库,而是等到事务提交或者Session关闭时才进行同步。`flush()`方法强迫Hibernate执行...

    退出页面自动清除session技巧

    ### 退出页面自动清除session技巧 在Web应用开发过程中,管理用户会话是十分重要的一个环节。Session机制作为实现用户状态跟踪的一种手段,在各种应用场景中都扮演着关键角色。但是,如何有效地管理并适时地清除...

    hibernate_flush 深入了解

    当达到特定条件或手动调用`Session.flush()`时,Hibernate会将这些变更持久化到数据库。 Flush过程主要包括以下步骤: 1. **对象状态检查**:Hibernate会检查Session中的所有对象,判断它们是否需要被更新、插入...

    Hibernate_Session_Transaction

    在Java的持久化框架Hibernate中,`Session`和`Transaction`是两个至关重要的概念,它们在数据管理和事务处理中起到核心作用。这篇文章将深入解析这两个概念及其相关知识点。 `Session`是Hibernate提供的一种与...

    BobBuilder_app

    Embedded: You can use RaptorDB inside your application as you would any other DLL, and you don't need to install services or run external programs. NoSQL: A grass roots movement to replace relational...

    关于flush和evict

    - **更新Session缓存**:`flush()`还会更新Session缓存,确保缓存中包含了最新的状态信息。例如,在第三个测试方法中,执行`flush()`后,person2被正式纳入Session缓存管理。 #### 三、evict()方法详解 `evict()`...

    通过HttpURLConnection获取SESSIONID

    out.flush(); out.close(); out.write(parameters.getBytes(),0,parameters.getBytes().length); InputStream in = hc.getInputStream(); InputStreamReader reader = new InputStreamReader(in,"gb...

    微软内部资料-SQL性能优化2

    By leveraging the Address Windowing Extensions API, an application can create a fixed-size window into the additional physical memory. This allows a process to access any portion of the physical ...

    proc-xscale.rar_flush

    This is the maximum size of an area which will be flushed. If the area is larger than this, then we flush the whole cache.

    数位板压力测试

    This specification is intended to be an open standard, and as such the text and information contained herein may be freely used, copied, or distributed without compensation or licensing restrictions. ...

    hibernate session生命周期示例

    本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个强大的工具。 Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括...

    使用redis实现分布式session

    这里,`store-type`设置为`redis`表明我们选择Redis作为Session存储,`namespace`是Redis中的键空间前缀,`flush-mode`定义了何时将Session保存到Redis,`connection-url`则是Redis服务器的地址。 接下来,我们需要...

    module_pg_flushbuffer

    在PostgreSQL数据库系统中,`module_pg_flushbuffer`是一个关键组件,主要负责数据缓冲区的刷新操作。在数据库系统中,缓冲区管理是性能优化的关键部分,因为它减少了磁盘I/O,提高了数据读写速度。当对数据库进行...

    hibernate的核心接口--Session

    ### Hibernate的核心接口——Session详解 #### 一、Session简述 **1. Session概念** - **定义**: Session 是 Hibernate 框架中最常用的接口之一,它又被称为持久化管理器。Session 负责所有与数据库交互的工作,...

    MySQL-Flush命令用法.docx#资源达人分享计划#

    MySQL Flush 命令用法详解 MySQL Flush 命令是 MySQL 中的一种非常重要的命令,它可以用于清除或重新加载各种高速缓存、表或者获取锁等。执行 Flush 命令必须要有 reload 权限。今天,我们将详细介绍 MySQL Flush ...

    flush插件下载

    flush插件下载

    Hibernate的Session_flush与隔离级别代码详解

    Hibernate的Session_flush与隔离级别代码详解 Hibernate 是一个基于Java的 ORM(Object-Relational Mapping)工具,提供了将 Java 对象映射到关系数据库的能力。其中 Session_flush 和隔离级别是两个重要的概念。 ...

Global site tag (gtag.js) - Google Analytics