为什么JPA中有这么多接口?

时间:2011-11-18 17:10:57

标签: java jpa dao

查看一些JPA代码,我看到了:

public interface Dao<T extends DomainObject>

public interface EventDao extends Dao<Event> - nothing added to Dao<Event>

public abstract class AbstractDaoJPAImpl<T extends DomainObject> extends JpaDaoSupport implements Dao<T> 

public class EventDaoJPAImp extends AbstractDaoJPAImpl<Event> implements EventDao

为什么需要这两个接口?为什么不简单

public abstract class AbstractDao<T extends DomainObject> extends JpaDaoSupport

public class EventDao extends AbstractDaoJPAImpl<Event>

我来自Ruby on Rails世界,事情似乎更简单。我很肯定这种Java方法有很多优点。我经常可以识别何时应该使用接口,但有时候我觉得Java开发人员会疯狂地接口。

2 个答案:

答案 0 :(得分:2)

JPA不需要这些界面。

您在JPA中唯一需要的是您的实体定义,包括映射到数据库的注释。而已。管理数据库连接和实体存储的EntityManager已由JPA编写,您不需要所有这些接口和类。

他们可能是由开发人员编写的,他们认为它会分离数据库层(以及JPA给你的EntityManager)和应用程序的任何其他层。

如果那是好事还是坏事是另一个话题......

答案 1 :(得分:1)

使用界面可以定义合同。此契约在具体的EventDao类中实现。

使用此类DAO的业务服务通常会使用EventDao接口作为注入依赖项。这有几个好处:

  • 能够轻松注入模拟EventDao实现以便对服务进行单元测试
  • 能够围绕具体实现添加动态代理
    • 声明式事务管理(尽管它应该是划分事务的服务,您可以使用MANDATORY传播在代理中验证事务存在)
    • 统计和绩效收集
    • 其他有用的方面......