关于使用DAO / Spring MVC / Hibernate的建议

时间:2011-07-13 20:27:56

标签: java hibernate spring-mvc

我正在努力清楚地了解这是如何运作的:

- 将DAO类与DAO接口一起使用有什么好处? - 如何处理Hibernate异常,即

public String doSomething(){
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();

      Query query = session.createQuery("");

    Object o = query.uniqueResult();

    session.close();

    return "success";
}

我不是“强迫”尝试/捕获,所以如何捕获/拦截可能发生的任何异常?

- 新DAO方法每次打开会话比获取当前会话更昂贵吗?如果我使用get,我应该关闭会话吗?

问题更新:

我的服务类中有@Service注释,对于使用dao接口的每个方法,我上面都有@Transactional。我还在所有DAO类中添加了@Repository

更新II:

我正在考虑为这些问题打开赏金,因为我想知道更多细节,这次我会提供一些。

  1. Spring context
  2. Controller
  3. Service Interface
  4. Service Implementation
  5. DAO interface
  6. DAO implementation
  7. 所以我想尽可能多地使用spring MVC,如何通过@Transactional处理会话开启/关闭?

    如何捕获异常(即非现有记录或数据库失败),如果有的话。

    我做错了什么?有人可以建议一些改进吗?

2 个答案:

答案 0 :(得分:7)

休眠会话方面的一些事情......

1。)我会在您的项目中查看集成Spring's事务管理。这样您就不必担心打开和关闭会话了,因为Spring会使用@Transactional注释为您处理这个问题。

2。)如果spring正在处理您的交易,您不必担心执行finally调用以确保所有内容都已关闭或回滚。

3。)如果你决定不使用Spring管理会话,你应该在任何延长的时间内保持开放但是如果你使用Spring,你不必担心关于它。

就我所提供的DAO课程界面而言......

1。)对接口进行编码被认为是一种很好的设计实践(参见下面的评论),这里有一些很好的理由。

假设你有......

public interface ShoppingCartService{

    public void doStuff(Object obj);

} 

您可以将此服务公开为servlet并处理您的界面创建的“合同”,甚至隐藏使用Hibnerate,JDBC或其他任何内容的事实......

@Service
public class PetShopShoppingCartService implements ShoppingCartService{

    @Transactional(propagation=Propagation.REQUIRED)
    public void doStuff(Object obj){
        //The Pet Shop service impl uses hibernate!;
    }
}

...或

public class DrugStoreShoppingCartService implements ShoppingCartService{

    public void doStuff(Object obj){
        //The Drug Store service uses JDBC;
    }
}

甚至......

public class NextBigThingShoppingCartService implements ShoppingCartService{

    public void doStuff(Object obj){
        //do stuff with next big thing;
    }
}

我想你得到的照片。如果您开发公共API或暴露服务,这变得非常重要。

最后,拥有接口的另一个好理由是在一个由多个开发人员组成的团队中工作。您可以快速存根界面,签到并告诉其他人这是它的样子。这允许他们看到什么是重要的,甚至模仿他们自己的impl如果他们需要(ThingServiceMockDataImpl

答案 1 :(得分:0)

仅仅因为在使用Spring的HibernateTemplate时没有被强制捕获异常并不意味着它们不会被抛出。它们只是RuntimeException而不是检查异常。此外,getCurrentSession()每次调用时都不会打开新会话,它会返回本地线程的会话。

使用DAO策略而不是将数据访问代码直接放入控制器中有许多优点,包括缺少代码耦合,封装和事务划分。有关详细信息,请参阅http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html