异常后的Hibernate会话对象

时间:2013-12-13 14:21:53

标签: java spring hibernate java-ee persistence

我有 A类类型的记录列表,让我们说List<A> list=new ArrayList<A>();

现在我正尝试使用session.save();将A的每条记录保存到数据库中。     如果我的第二个记录失败,那么我的其余记录都会失败。在这种情况下,我尝试使用session.evict(obj)从会话中删除第二条记录。但我仍然得到同样的行为。     以下是代码:

 for(A a:list){
    try{
    session.save(a);
    }
    catch{
    log.exception("Primary key");
    session.evict(a);
    }
    }

3 个答案:

答案 0 :(得分:0)

致电saveOrUpdate(a)而非session.save(a);

修改

start transaction
    session.saveOrUpdate(a);
    a.getId() // this should have id.
    return a;   
end transaction

答案 1 :(得分:0)

根据您的代码,我在代码中没有看到session.flush(); session.clear();这种方法。所以更新你的代码如下

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
int i = 0;
for(A a:list){
    try{
        session.save(a);
        if (i % 20 == 0 ) { 
            //20, same as the JDBC batch size
            //flush a batch of inserts and release memory:
            session.flush();
            session.clear();
        }
        i++;        
    } catch {
        log.exception("Primary key");
        session.evict(a);
    }
}
tx.commit();
session.close();

希望这能解决您的问题

答案 2 :(得分:0)

你为什么要从会话中驱逐它? 你可以忽略它 然后它将在迭代时保存成功的对象,并将错误保留为一个 另一种方法是,一旦在catch块中逐出对象,就可以刷新会话 希望这可能有效