В своем коде веб-приложения (jsp + hibernate + hsqldb на tomcat) я использую несколько реализаций 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();
}
}
}
Дао для конкретного домена:
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());
}
}
}