【问题标题】:Why so many interfaces in JPA? [closed]为什么 JPA 中有这么多接口? [关闭]
【发布时间】:2023-03-07 16:08:01
【问题描述】:

查看一些 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 开发人员对接口疯狂。

【问题讨论】:

  • 您正在混合 JPA 和 DAO 概念。 JPA != DAO。它们可以一起使用,但 JPA 通常被视为 DAO 的替代品,因为 JPA 由 标准 支持。相关:stackoverflow.com/questions/3818589/…
  • 先搞清楚JPA本身是什么,再发一个真实的问题
  • 实际上,您需要一个 DAO 接口,以便您可以轻松地将一种实现切换到另一种实现(例如模拟 dao 的单元测试......)。您还可以轻松地执行切换 dao 实现之类的操作,以将负载测试结果与不同的 dao 集或类似的东西进行比较......并且您使用通用接口来避免必须将所有基本的 crud 方法添加到所有非通用 dao 接口

标签: java jpa dao


【解决方案1】:

JPA 不需要这些接口。

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

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

这是好事还是坏事是另一个话题……

【讨论】:

    【解决方案2】:

    使用接口允许定义合同。该契约在具体的 EventDao 类中实现。

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多