我用hibernate更新三个整型值,第一次提交 hibernate总是很快的完成 并且前台立即更新到修改后的值,这里我使用request.getSession(true).setAttribute来保存更新数据,在页面之间传递数据的。为什么我在点一次修改,提交时hibernate运行超慢,过了一段时间后,出错了 报:org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update。我***.hbm.xml都是手工写的,不存在网上说的什么把catlog=“***”的语句啊。
还有一个问题是:我的另一个页面要修改个人信息,比如邮箱,昵称,我点修改,数据库保存了 那为什么前台还是显示原来的呢,我把hibernate的session Close后,运行,当要跳转到编辑个人信息页面时 报:session is closed。页面无法显示。郁闷 我session已经flush了
我已经在网上找了很多答案了 什么方法都有,都对照过 什么字段长度和数据库长度不符啊 什么的 我没有这个问题啊!
    郁闷啊 学java学到这份上 我都没耐心了 难道java非要在这种框架上折腾时间吗?

解决方案 »

  1.   

    大虾们 帮帮我吧 唉 就因为这些问题 都困扰了我很长时间了 我初学hibernate,摸索着前进,希望将来能靠这些找到份工作,能有口饭吃,现在java框架学习市场因为各种问题受阻,唉,看来我这个上半年是找不到工作了。
      

  2.   


    public ActionForward doEdit(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)throws IOException{
    PeopleForm peoForm = (PeopleForm) form;// TODO Auto-generated method stub
    TPeople peopleInfo=peoForm.getPeoItem();//将form中的值 保存在个人实体类中
        biz.updateSinglePeo(peopleInfo);//然后更新个人     TPeople people=biz.findPeoById(peopleInfo.getPeoId());//将跟新后的值再查询
       
        request.setAttribute("peopleinfo", people);//保存在request中
        
    return mapping.findForward("ShowEditPeople");//跳转到跟新后的页面
    }hibernate 中的代码  public void update(TPeople peoInfo){
    Transaction tx=null;
    session=sf.openSession();
    try{
    tx=session.beginTransaction();
    session.update(peoInfo);
    tx.commit();
    }catch(Exception ex){
    if(tx!=null){tx.rollback();}
    ex.printStackTrace();
    }finally{

    session.flush();

    }
    }
    做的比较简单 大哥们帮我分析下
      

  3.   

    那你在hibernate.cfg.xml配置文件里面连接数据库改成
    <property name="hibernate.connection.url">
    jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=HR;user=aaa;password=aaa;
    SelectMethod=cursor;
    </property>
    主要是加上SelectMethod=cursor;试试看
      

  4.   

    那你在hibernate.cfg.xml配置文件里面连接数据库改成
    <property name="hibernate.connection.url">
    jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=HR;user=aaa;password=aaa;
    SelectMethod=cursor;
    </property>
    主要是加上SelectMethod=cursor;试试看
      

  5.   

     public void update(TPeople peoInfo){
            Transaction tx=null;
            session=sf.openSession();
            try{
                tx=session.beginTransaction();
                session.update(peoInfo);
                tx.commit();
            }catch(Exception ex){
                if(tx!=null){tx.rollback();}
                ex.printStackTrace();
            }finally{
                
                    session.flush();
                
            }
        }你写程序怎么不关的啊,关掉就没事了
      

  6.   

    你的sessio每次打开执行完后就要关闭..
      

  7.   

    你在session没有关闭 的时候又开启了session,当然会提示session is not closed
      

  8.   

    session.flush();----》
    session.close();
      

  9.   

    我试过session.closed这个方法 运行时就是报session is closed错误啊
      

  10.   

    我今天学习夏昕的《深入浅出Hibernate》,看到了hql的写法。
    我现在把更新的那段hibernate程序改掉了,不是全体更新,而是写一句hql语句,要修改什么 就更新什么,问题解决了:即执行一次更新可以运行不报错,但是运行第二次的更新就报org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update的错误。但是第二个问题还是如此,我断定是session的问题,继续深入浅出Hibernate,寻找问题的根由。
      

  11.   

    恩 楼上说的有道理,可是我试着关闭session,运行时 就是报session is closed.
    难道我在jsp里用了session来存储个人信息的缘故。但是此session非彼session啊!
      

  12.   


    package com.sunyard.DBO;import java.util.Iterator;
    import java.util.List;import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;import com.sunyard.bean.Person;/*
     * 具体操作Hibernate的类
     * 增加、删除、修改、按ID查询、模糊查询、查询全部操作
     */
    public class PersonDBO {

    //在Hibernate中,所有的操作都是在Session中完成
    //此Session不同于JSP中的Session
    private Session session=null;
     
    //在构造方法中实例化Session对象
    public PersonDBO(){
    //找到Hibernate配置
    Configuration config=new Configuration().configure();
    //从配置中取出SessionFactory
    SessionFactory factory=config.buildSessionFactory();
    //从SessionFactory中取出一个Session
    this.session=factory.openSession();
    }

    //所有的操作都是通过session进行的
    //插入
    public void insert(Person p){
    //打开事务
    Transaction tran=this.session.beginTransaction();
    //执行插入语句
    this.session.save(p);
    //提交事务
    tran.commit();
    this.session.close();
    }

    //更改
    public void update(Person p){
    //打开事务
    Transaction tran=this.session.beginTransaction();
    //执行插入语句
    this.session.update(p);
    //提交事务
    tran.commit();
    this.session.close();
    }

    //按ID查询 推荐用HQL
    public Person queryById(String id){
    Person p=null;
    //使用Hibermate查询语句
    String hql="from Person as p where p.id=?";
    //通过Query接口查询
    Query q=this.session.createQuery(hql);
    q.setString(0,id);
    List l=q.list();
    Iterator iter=l.iterator();
    if(iter.hasNext()){
    p=(Person)iter.next();
    }
    this.session.close();
    return p;
    }

    //删除1
    //使用此方法删除数据之前,必须先查找到数据对象,性能会打折
    public void delete(Person p){
    //打开事务
    Transaction tran=this.session.beginTransaction();
    //执行插入语句
    this.session.delete(p);
    //提交事务
    tran.commit();
    this.session.close();
    }

    //根据HQL的语句进行了修改,增加了删除指令
    public void delete(String id){

    Transaction tran=this.session.beginTransaction();
    String hql="delete Person where id=?";
    Query q=this.session.createQuery(hql);
    //设置参数
    q.setString(0, id);
    //执行更新语句
    q.executeUpdate();
    tran.commit();
    this.session.close();
    }

    //查询全部数据,写HQL
    public List queryALL(){
    List l=null;
    String hql="from Person as p";
    Query q=this.session.createQuery(hql);
    l=q.list();
    this.session.close();
    return l;
    }

    //模糊查询
    public List queryByLike(String cond){
    List l=null;
    String hql="from Person as p where p.name like ?";
    Query q=this.session.createQuery(hql);
    q.setString(0, "%"+cond+"%");
    l=q.list();
    this.session.close();
    return l;
    }

    }添上一个简单的hibernate操作数据库的类,希望对你有帮助
      

  13.   

    session没有关闭,可能是同一持久化对象在不同事务操作引起的,简单说是状态管理错误
      

  14.   

    建议LZ再结合spring,要spring支持hibernate的HibernateTemplate来管理你的session什么的,省去很多事..
      

  15.   

    建议你就用类似16楼的那种写法:
    1、创建一个session,
    2、打开Transaction,
    3、处理业务
    4、关闭transaction
    5、关闭session这样感觉既清晰,又有条理。
      

  16.   

    楼主你的表达能力还不是很强,特别是涉及到这些操作的代码以及错误的完整代码没贴出来(只是贴了部分,不全)。
    总得来说,问问题的人没说不明白,导致回答问题的人只好去猜测问题所在。
    建议楼主把你的问题涉及到的代码统一贴出来,包括hbm、hibernate.cfg.xml的代码,因为Hibernate有lazy策略,你没贴出来,谁知道你到底是怎么配置的。对于“还有一个问题是:我的另一个页面要修改个人信息,比如邮箱,昵称,我点修改,数据库保存了那为什么前台还是显示原来的呢,我把hibernate的session Close后,运行,当要跳转到编辑个人信息页面时 报:session is closed。页面无法显示。郁闷 我session已经flush了”
    我不知道你有没有用到Spring,如果用到,在web.xml加入OpenSessionInView,这个就是为了解决你前台比如jsp页面读取数据库时session关闭的问题,原因就在于:你在业务操作时关闭了session,等到你转向页面想读取数据时,由于session被关闭,当然就读不出来报session is closed了。
    web.xml加入OpenSessionInView配置如下(此处为Spring提供的解决方案): <!--为了避免Hibernate懒加载异常而创建的解决方案  -->
    <filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>对于“我用hibernate更新三个整型值,第一次提交 hibernate总是很快的完成并且前台立即更新到修改后的值,这里我使用request.getSession(true).setAttribute来保存更新数据,在页面之间传递数据的。为什么我在点一次修改,提交时hibernate运行超慢,过了一段时间后,出错了报:org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update。我***.hbm.xml都是手工写的,不存在网上说的什么把catlog=“***”的语句啊。”你所说的“第一次提交 hibernate总是很快的完成并且前台立即更新到修改后的值”,因为你用了会话技术(session,不是hibernate的session),当然“前台立即更新到修改后的值”了。因为不知道你代码到底是怎么写的,你说“为什么我在点一次修改,提交时hibernate运行超慢”,这个时候Console的打印信息是怎样的?特别是数据库操作语句打印出来的是什么
    ps.你在hibernate.cfg.xml里的<session-factory>标签内加入<property name="show_sql">true</property>,这样就会每执行一个数据库操作,都会打印出数据库语句。
    一般hibernate.cfg.xml的配置如下,仅作参考:<hibernate-configuration>
        <session-factory>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://localhost:3306/student</property>
            <property name="connection.username">root</property>
            <property name="connection.password">123456</property>        <property name="connection.pool_size">1</property>
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="current_session_context_class">thread</property>
            <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
            <property name="show_sql">true</property>
            <property name="hbm2ddl.auto">update</property>
            
        </session-factory>
        
    </hibernate-configuration>
      

  17.   

    wahttp://download.csdn.net/source/595036
      

  18.   

    120http://download.csdn.net/source/595036
      

  19.   

    我也是个菜鸟  随便说说   ··· 
           你在更新的时候确定的你的PO是持久化状态还是游离状态    建议用 SAVAORUPDATE 方法试一试
      

  20.   

    不要直接在spring、hibernate上搞了,直接上grails
      

  21.   

    你的hibernate管理session没管理好,我记得有一个多表连接操作的时候有一个  什么属相要设置一下,如果没有设置老是报session没有关闭错误,第一次运行的很好,第二次就不行了,你在网上查查看,就是hibernate自动生成的文件中的一个属相
      

  22.   

    16楼写得很全面的了要了解session的3个状态
      

  23.   

    Could not execute JDBC batch update
    你看看你的语句执行吧。错误提示:不能执行批处理你的session是实例变量,但是你每次调用一个方法执行后,都会关闭它;
    当另一个方法使用时,一定会报错:session is closed。
    解决办法:
    1》在每一个数据库操作方法里,第一行加上PersonDBO方法。
    即是每次使用现open个session,用完就关闭。
    2》在每一个数据库操作方法里,去掉关闭session语句,另写一个方法执行关闭;在执行完所有操作后,一次性关闭。
    另外33楼的做饭看起来不错。你可以试一试。
      

  24.   

    典型的hibernate事务处理问题,原因是你在做查询的时候可能嵌套了一个查询,所以第二个查询结束后session关闭,如果还要继续使用第一个查询的级联映射就会产生问题.
    解决方案: 
    1. 不采用延迟加载,采用立即加载.
    2. 自定义hibernate的事务处理,换句话说,自己去控制sessionFactory,对session进行open和close推荐第2种,第一种可能存在严重效率问题,但是第一种的操作简单,只需要修改下XML就OK了
      

  25.   

    哇,两天没上网,就有这么多人来帮忙,谢谢各位,那我要看一下spring了,听说这个框架提供了很多支持,相信我所遇到的问题一定会解决。关键是session的管理,我想:每编完一个数据存取代码,就要关闭session,也不好!是不是太频繁了。
     我那时做的时候,没有用到spring,也没有涉及到hibernate的延时加载,三个框架也得慢慢来。
      

  26.   

    不要open
    HibernateSessionFactory.getSession()
      

  27.   

    你应该在对数据那些操作完成后关掉session 因为session是很占资源的,持久化对象后不做其他操作了就应该关闭session释放资源,还有就是你持久化对象又就要提交事务,不然你拿到的是游离态的对象。
      

  28.   

    最笨的方法,不用session更新,用hibernate的hql语句更新,基本问题可以搞定
      

  29.   

    专门写一个对session打开和关闭的类,这样在以后类引用中会省很多事的,大家共同分享下:
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;public class HibernateUtil {
    private static final SessionFactory sessionFactory;
    static {
    try {
        // Create the SessionFactory
           sessionFactory = new Configuration().configure().buildSessionFactory();
    } catch (Throwable ex) {
           ex.printStackTrace();
           throw new ExceptionInInitializerError(ex);
    }
    } public static final ThreadLocal tread = new ThreadLocal(); public static Session openSession() throws HibernateException {
    Session session = (Session) tread.get();
    // Open a new Session, if this Thread has none yet
    if (session == null||!session.isOpen()) {
    session = sessionFactory.openSession();
    tread.set(session);
    }
    return session;
    } public static void closeSession() throws HibernateException {
    Session s = (Session) tread.get();
    tread.set(null);
    if (s != null)

                      s.close();
    }
    }
      

  30.   

    是不是这样:
    你每次访问数据库的时候都在new一个session,应该在HibernateSessionFactory里获取一个session,有工厂统一管理session.
    这样就不用每次操作都要创建一个session,然后销毁session.当创建过多的session,又长时间没有销毁,也会出现问题的。PS:学东西要有耐心。
      

  31.   

    谢谢各位 我编写了个类 专门来管理session,可以正常运行了。唯一的就是:数据库更新后,紧接着根据id查询这个值,查询出来的还是原来的,我用的是hql,用query.list()返回,是不是缓存的问题?
      

  32.   

    hibernate的缓存机制应该很有搞头,我在编辑的数据库操作方法内加上session.evict(TPerson.class);sessionFactory.evict(TPerson.class,Integer id);强制清除缓存
    更新数据后跳转页面还是显示原来的,看来再好好看看hibernate了。
      

  33.   

    我记得以前看过,两个session是不同的,以前我们用的session指的是会话信息,它主要保存用户信息和数据。hibernate中的session是保存数据库信息的连接,它由sessionFactory创建,一个session对应了一个数据库连接实例。
      

  34.   

    建议你就用类似16楼的那种写法: 
    1、创建一个session, 
    2、打开Transaction, 
    3、处理业务 
    4、关闭transaction 
    5、关闭session 
      

  35.   

    我是初学着 来学习的 好多牛人 UP UP !!