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

Lon*_*don 1 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";
}
Run Code Online (Sandbox Code Playgroud)

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

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

问题更新:

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

更新II:

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

  1. 春天的背景
  2. 调节器
  3. 服务接口
  4. 服务实施
  5. DAO接口
  6. DAO实施

所以我想尽可能多地使用spring MVC,如何通过@Transactional处理会话打开/关闭?

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

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

Mic*_*Lee 7

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

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

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

3.)如果您决定不使用Spring来管理会话,则不应该长时间保持打开状态,但是如果您使用Spring,则不必担心它.

至于DAO类的界面我提供这个......

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

让我们说你有......

public interface ShoppingCartService{

    public void doStuff(Object obj);

} 
Run Code Online (Sandbox Code Playgroud)

您可以将此服务公开为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!;
    }
}
Run Code Online (Sandbox Code Playgroud)

要么...

public class DrugStoreShoppingCartService implements ShoppingCartService{

    public void doStuff(Object obj){
        //The Drug Store service uses JDBC;
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至...

public class NextBigThingShoppingCartService implements ShoppingCartService{

    public void doStuff(Object obj){
        //do stuff with next big thing;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想你明白了.如果您开发公共API或暴露服务,这变得非常重要.

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

  • 100%同意迈克尔的评估.至于接口问题,对接口进行编码被认为是一种好的做法,允许接口表达合同和类来履行合同.还有其他更实际的原因,例如允许动态代理,但这可能是最好的. (2认同)