2011-06-22 49 views
0

我是否总是需要将saveOrUpdatedelete放在Session的DAO中,并使用try-catch块如下图所示?我是否需要用try-catch包含所有saveOrUpdate方法?

public void save(Inventory object) { 
    try { 
     factory.getCurrentSession().saveOrUpdate(object); 
    } catch (Exception e) { 
     _logger.error("Cannot save or update object " + object, e); 
    } 
} 

回答

2

通常取决于您是否要处理您的DAO中的特定异常。但请注意,在您的具体示例中,会话可能不会被刷新,因此无论如何您都不会得到任何有趣的异常(如违反约束)。所以我认为抓住它们比让它们传播更不合理。但是没有坚定的规则。

+0

正如Alex所说。您需要确保会话已提交或回滚,并且通常也会关闭。哪里取决于你想要什么。 – MJB

1

org.hibernate.Session.saveOrUpdate抛出HibernateException,所以是的,这可能是一个好主意来捕获异常。但是,如果可以的话,我建议在try/catch块中完成整个事务,以便在失败时可以回滚它。下面是这样一个常见的成语:

Session sess = factory.openSession(); 
Transaction tx; 
try { 
    tx = sess.beginTransaction(); 
    //do some work 
    //(your call to saveOrUpdate() would go in here somewhere) 
    ... 
    tx.commit(); 
} 
catch (Exception e) { 
    if (tx!=null) tx.rollback(); 
    throw e; 
} 
finally { 
    sess.close(); 
} 

你可以找到更多信息here和更普遍的关于Hibernate here

+0

我使用Spring 3,我猜''处理提交和回滚,不是吗? – Rihards

0

有几种模式可以使用。

最简单的是声明throws Exception,但抛出Exception是一个非常糟糕的设计选择 - 它太高级了。实际上,这个villan是Hibernate--它的方法应该被声明为抛出比Exception更窄的东西。

一个更好的办法是:

  1. 定义“域异常”,如MyDatabaseException
  2. 声明你的方法把那
  3. 抓然后再次抛出裹在你的域例外
  4. 异常

像这样:

public void save(Inventory object) throws MyDatabaseException { 
    try { 
     factory.getCurrentSession().saveOrUpdate(object); 
    } catch (Exception e) { 
     throw new MyDatabaseException(e); 
    } 
} 

第二种方法是一种常用的模式。

P.S.如果你将@Testh与try-catch-finally的好主意结合起来,你会得到更好的方法。

+0

谢谢!我应该在哪里处理'MyDatabaseException'异常? – Rihards

0

我们的设计是让业务逻辑代码处理try和catch异常,因为它知道它是否需要重试或不需要重试以及下一步要做什么。 DAO类将捕获所有异常并抛出业务逻辑代码,从而只专注于数据库克隆部分。所以DAO类在将来总是可以重用的。

相关问题