2013-12-13 46 views
2

我有类型A类,比方说List<A> list=new ArrayList<A>();的记录列表。异常后的Hibernate会话对象

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

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

发生异常后,您不能继续使用会话。另请参阅http://stackoverflow.com/questions/5109175/hibernate-session-is-invalidated-after-constraintviolationexception – isnot2bad

+2

我认为你将不得不重做你的逻辑,因为在Hibernate中抛出异常之后,行为是不可预料的。 –

+0

异常之后,我仍然可以使用会话对象。 – ravindranath

回答

0

通话saveOrUpdate(a)代替session.save(a);

编辑

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

我想返回生成的标识符。 – ravindranath

+0

通过使用saveOrUpdate我找不到我生成的标识符 我需要返回标识符 – ravindranath

+0

您可以返回应该有生成的标识符的同一个对象。 – Prabhakaran

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(); 

希望这将解决您的问题

0

为什么你会话驱逐它更新您的代码? 你可以忽略它。
它会在迭代过程中保存成功的对象并保留错误。
其他方法是,一旦对象在catch块中被驱逐,就可以刷新会话。
希望这可以工作