【问题标题】:Hibernate session object after exception异常后休眠会话对象
【发布时间】:2014-01-01 08:31:24
【问题描述】:

我有 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);
    }
    }

【问题讨论】:

  • 出现异常后无法继续使用会话。另见stackoverflow.com/questions/5109175/…
  • 我认为你必须重新设计你的逻辑,因为在 Hibernate 中抛出异常后,行为是不可预测的。
  • 异常后我仍然可以使用会话对象。

标签: java spring hibernate jakarta-ee persistence


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据您的代码,我没有在您的代码中看到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();
    

    希望这能解决您的问题

    【讨论】:

      【解决方案3】:

      调用saveOrUpdate(a) 而不是session.save(a);

      编辑

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

      【讨论】:

      • 我要返回生成的标识符。
      • 通过使用 saveOrUpdate 我找不到生成的标识符我需要返回标识符
      • 您可以返回应该具有生成标识符的相同对象。
      • saveOrUpdate 不返回任何内容?如果我错了,请提出建议
      • 仍然面临同样的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 2011-02-14
      • 2012-06-02
      相关资源
      最近更新 更多