【发布时间】:2011-07-21 08:00:20
【问题描述】:
在我的 Web 应用程序(tomcat 上的 jsp+hibernate+hsqldb)代码中,我使用了几个 Dao 实现。基类 Dao 实现包含所有会话打开、关闭逻辑。许多特定于域的 Dao 类扩展了这个基础类提供具体的 find(),delete() 方法
我想在发生错误时向用户提供有意义的消息,而不是 error500 消息。 由于基类方法使用 hibernate.Session 类的 get()、saveOrUpdate() 方法,它们会抛出 HibernateException。特定于域的子类需要捕获它并将其包装在一些自定义异常中并重新抛出它。
我尝试过这种方式..我不知道这是否是正确的方法..我欢迎您的意见/建议
真诚的,
吉姆
abstract class BaseDao{
private Class persistentClass;
public BaseDao(Class persistentClass) {
super();
this.persistentClass = persistentClass;
}
public Object findById(Long id) {
SessionFactory factory = HibernateUtil.getSessionFactory();
Session session = factory.openSession();
Object object = null;
try {
object = (Object) session.get(persistentClass, id);
return object;
}
finally {
session.close();
}
}
@Override
public void saveOrUpdate(Object obj) {
SessionFactory factory = HibernateUtil.getSessionFactory();
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.saveOrUpdate(obj);
tx.commit();
}catch(HibernateException e){
if (tx != null) {
tx.rollback();
}
throw e;
}finally {
session.close();
}
}
}
特定领域的 dao 是
class SaleOrderDao extends BaseDao{
public SaleOrderDao() {
super(SaleOrder.class);
}
@Override
public SaleOrder findSaleOrderById(Long saleOrderId){
SaleOrder so = (SaleOrder)findById(saleOrderId);
return so;
}
@Override
public void saveOrUpdateSaleOrder(SaleOrder so){
try{
saveOrUpdate( so);
}catch(HibernateException e){
String msg = "could not insert/update saleorder"+so.getSONumber();
throw new SaleOrderDaoException(msg+"/ "+e.getMessgae());
}
}
}
【问题讨论】:
-
我认为最好在方法签名中抛出异常,这样就不需要重新抛出异常,您将限制try catch中方法的使用。