我正在开发一个通过Hibernate调用数据库后端的Java Web应用程序。我使用servlets,jsp和tomcat进行测试/部署。大多数关于Java-ee的书籍都建议使用Dao类进行数据库调用。我创建了一个通用基类和一个特定的子类,如下所示。
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){
saveOrUpdate( so);
}
}
在浏览该论坛中的帖子时,我遇到了Ryan Stewart的advice,建议不要以dao方法开始和结束事务。.遗憾的是,我的项目没有使用任何支持事务管理的Web框架。仅限使用jsp,servlet和servlet容器。
有什么办法可以重写我的dao实现,以便可以正确地管理事务。.从这本书中我找不到任何相关内容。
希望有人帮助我提出建议
真诚的
吉姆
最佳答案
通常,不应在DAO中处理交易。它们应由服务层处理。一种服务方法可能包括都在同一事务中的多个DAO调用。
Spring(以及其他DI框架)允许您通过使用@Transactional
注释服务方法来做到这一点。如果没有spring,您仍然可以在服务层中手动进行操作
关于java - 正确实现dao类以管理交易,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6777478/