Session session = getHibernateTemplate().getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
int count = 0;
try{
for(int i=0;i<data.size();i++){
try{
session.save((TbRawData)data.get(i));
count++;
}catch(HibernateException e){
e.printStackTrace();
}
System.out.println("id:"+count);
if(i%1000==0){
session.flush();
session.clear();
}
}
tx.commit();
}catch(HibernateException   e){
tx.rollback();
e.printStackTrace();
}finally{
session.close();
}
return count;
是这样的,由于效率问题,我想批量把数据插入数据库,但是这样的话如果一条数据有问题,那么全部都会rollback,现在是想让有错的数据不管,其他的照常插入,请问下session.save后抛出异常,怎么把这个搞掉,然后flush的时候不报错呢??

解决方案 »

  1.   

    把 try catch 的范围缩小
      

  2.   

    ??怎么缩小法?异常处理机制你不懂吗?你一个大 catch 把所有数据操作都放一块处理了,一旦有一个抛异常了,其他的就受干连;如果你分开处理,其他就不会受影响了
      

  3.   

    session.save出错后 后面的session.flush都会有问题的。
      

  4.   

    现在是session.save由于有条数据有误会导致有一条插入数据会报异常,这个报异常后session.flush 就会有问题了,但是catch session.save这个异常后在catch里面用session.evict(obj) 本来打算是清除那条数据,但是这个又报错,报null id,但是session.save 没成功,这个对象就没有id值啊(id是递增的)。求解求救~
      

  5.   

    先说你这个循环调用save方法,这不是批量操作。
    去掉事务控制,让它自动提交,就可以了。