当前位置: 首页 > 面试题库 >

Java EE体系结构-在使用JPA 2之类的ORM时是否仍建议使用DAO?

邢飞雨
2023-03-14
问题内容

如果我使用的是JPA2之类的ORM-我的实体已映射到数据库,那么我是否仍应使用DAO?似乎要增加很多开销。

例如,我将需要维护三个额外的程序包:

  1. 一个指定我的域对象的对象(它几乎映射了我的Entity对象):
        public class Employee {
        private String firstName;
        private String lastName;
        ...
        // Getters and setters
    }
  1. 一种包含指定我的DAO方法的接口
        public interface EmployeeDAO {
        public void addEmployee(Employee employee);
        public Employee getEmployeeById(long id);
        ...
    }
  1. 其中包含实现我的DAO的会话bean
        public EmployeeJpaDAO implements EmployeeDAO {
        interface method implementations here
        ....
        private method that transform my Employee entity into my Employee domain object
    }

现在,每当我需要执行新的CRUD操作时,都会增加很多额外的负担。

但是,从DAO中我看到的好处是:

  1. 您可以在内存中实现DAO,以对服务层进行单元测试。这意味着您无需访问数据库即可测试业务逻辑,并且可以确保您的对象将始终包含相同的属性值

  2. 它将业务逻辑与数据库访问逻辑分开

不涉及实现DAO的选项是仅在服务层中使用实体对象和EntityManager:

    @Stateless
    public class EmployeeEjb {
        @PersistenceContext(unitName = "employee")
        private EntityManager manager;

        public Employee getEmployeeById(long id) {
            return manager.createNamedQuery(Employee.GetEmployeeById).getResultList();
        }
        ...
    }

这里没有中间立场吗?有人遇到过满足我上面提到的DAO层的某些优点(最重要的是业务逻辑的单元可测试性)但又不涉及实现DAO层的所有开销的体系结构或实现的体系结构吗?

感谢您的任何建议和/或建议!我真的很想知道有人对此提出了什么建议。


问题答案:

如果我使用的是JPA2之类的ORM-我的实体已映射到数据库,那么我是否仍应使用DAO?似乎要增加很多开销。

它是。显然,Java EE
在使用JPA时不鼓励使用DAO模式(JPA已经提供了域html" target="_blank">存储模式的标准化实现,并且在DAO后面屏蔽它没有太多价值)。我发现DAO
在这种情况下是反干的。

因此,对于 简单的 情况(实际上,大多数情况下),我很乐意跳过DAO,对此我没有任何问题。对于更 复杂的
情况(例如,当使用存储过程,平面文件时),我会使用它。换句话说,这取决于JPA是否杀死了DAO?。另请参阅以下相关问题:

不,您当然不希望将DAO实现为会话Bean:

  • 您不想创建与表一样多的(池化)Session Bean(浪费大量资源)
  • 您不想在任何地方都链接Session Bean,不要重现过去的错误,这是一种已知的不好的做法,无法很好地扩展。

因此,如果您真的想采用DAO方式并希望注入EM,则可以将DAO实现为Spring Bean(在Java EE 5中)或CDI托管Bean(在Java EE6中)。

您可以在内存中实现DAO,以对服务层进行单元测试。

如果您真的要进行 单元 测试,请模拟DAO/EntityManager,没有区别。而且,如果要进行集成测试,则可以将JPA配置为使用内存数据库。所以最后,我只是不赞成这种说法。

它将业务逻辑与数据库访问逻辑分开

老实说,我认为依靠DAO与实体经理之间没有 太大的 区别,我也看不到DAO如何将事情“更好地”分开。同样,我不赞成这种说法。

根据我的经验,更改底层的持久性解决方案是非常特殊的事情,并且我不会针对不太可能发生的事情引入DAO(YAGNI,KISS)。

这里没有中间立场吗?有人遇到过满足我上面提到的DAO层的某些优点(最重要的是业务逻辑的单元可测试性)但又不涉及实现DAO层的所有开销的体系结构或实现的体系结构吗?

我没有看到太多中间立场,并且强烈暗示说,如果我感觉不到需要,则不使用DAO。正如我所说,EntityManager如果您要真正地对业务逻辑进行单元测试,请模拟一下。它对我有用,我很高兴编写更少的代码。

更多资源

  • JPA / EJB3杀死了DAO
  • DAO并没有死-但它们要么崩溃,要么消失
  • …最后,如果出现以下情况,您应该引入DAO:


 类似资料:
  • 问题内容: 你用代替吗? 我的意思是作为返回值或设置String变量的值。我不是要进行比较,因为我们在那里使用 问题答案: 当然不是。您是否真的认为“”不够清晰? 常量本质上有3个用例: 记录值的含义(常量名+ javadoc) 根据通用值同步客户端。 提供一个特殊值的捷径,以避免一些启动费用 在此均不适用。

  • 问题内容: 我需要将搜索功能添加到在tomcat上运行的Java Web应用程序中,以及数据库以及同一台计算机上。 由于我计划在同一台计算机上使用Solr,但应使用哪种实现?我以为嵌入式嵌入式服务器更可取,因为我需要从同一台计算机添加数据,因此通过HTTP添加将没有多大意义,不是吗?而且将Solr作为单独的Web应用程序运行将比嵌入式Web应用程序消耗更多的资源(不是吗?)。 但是现在不建议使用E

  • AES ARCFOUR DES 取消 PBEWITHAND PbeWithand PBEWITHMD5AndDES(PKCS5,v 1.5), PBEWITHMACSHA256ANDAES_128(PKCS5,v 2.0) 实际上,文档中没有提到Scrypt的任何地方。

  • 问题内容: 我正在计划制作Java Swing应用程序,并且想知道是否仍在使用Swing或是否已将其替换为其他东西。 提前致谢! 问题答案: 我们仍然使用它。并非所有的东西都是Web应用程序,到目前为止,已经进行了一些尝试性的替换(例如,将Eclipse写入到 SWT 中)。SWT拥有一个本机层,将基础调用包装到本机窗口层。它仅适用于有限的平台集,并且当然需要一些第三方共享库。我敢说,SWT应用程

  • 本文向大家介绍用 Composer构建自己的 PHP 框架之使用 ORM,包括了用 Composer构建自己的 PHP 框架之使用 ORM的使用技巧和注意事项,需要的朋友参考一下 回顾 经过前三篇文章 基础准备 、 构建路由 和 设计 MVC ,我们已经得到了一个结构比较完整的 MVC 架构的 PHP 微框架,但是距离一个真正能够上手使用的框架还差一样东西: 数据库封装 ,本篇就将讲述如何集成一个

  • 问题内容: 我正在考虑将Java用于大型项目,但是我找不到能够在Java中远程表示结构的任何东西。我需要能够将网络数据包转换为可在应用程序中使用的结构/类。 我知道这是可以使用,但这种方式是 不 接受的。因此,我很好奇是否可以像在C语言中那样将一组字节“广播”到一个结构中。如果这不可能,那么我将无法使用Java。 因此,我要问的问题是,是否有可能无需指定对齐方式和数据类型就将任何类型的对齐数据都转