写点什么

DAO 已死在 JPA 手上?

  • 2007-09-16
  • 本文字数:1009 字

    阅读完需:约 3 分钟

最近有人讨论到 Java Persistence API (JPA)是否已经杀死了 Data Access Object (DAO)。JPA 定义了将普通 Java 对象(有些人称之为 POJO)持久化到数据存储的接口。它大致上提供了与 Hibernate 之类相似的对象—关系映射。而 DAO 简单来说,可以总结为:

数据访问对象(DAO)是一种软件组件,它在应用程序与一个或多个数据存储设备(如数据库或文件)之间提供了一种通用的接口。

多数讨论的参与者都选择了各自的立场。其中一方,也是讨论的发起者 Adam Bien 认为:

……用法没法再简单了。只要把 EntityManager 注入到 bean 类……DAO 模式对于一般的数据访问不再有意义,不过某些数据访问还是需要它,比如访问存储过程、纯文件等……

几天之后, Magle 反驳说 DAO 还活得好好的,

上星期有些言论和博客文章谈论 DAO 模式的终结,特别联系到了 EJB 3 及其 EntityManager 的崛起。他们提议在你的面向业务的服务里直接使用 EntityManager,不必再把数据访问逻辑包装到 DAO 里面。我强烈反对这种意见……

Magle 接着解释了他的观点,并特别点出以下几个关键问题:

在对《 JPA/EJB3 Killed the DAO 》的补充帖子里,Adam Bien 进一步阐明了他认为 DAO 不再有必要的理由,

DAO 模式可以看成是“数据服务层”,它封装了特殊的而且常常是专用的数据访问实现。这样一层的主要目的为了让你独立于特定的数据库和 OR 映射实现。但即使是从前,我也从来没试过需要替换数据库,甚至从没试过从 SQL 换到 LDAP。
在有些情况下,例如要封装遗留系统,层次是不可改变的。照我的看法,在 Java EE 5 里面,DAO 可以被大大优化(直到消失掉:-))。DAO 接口、实现和工厂以及实际的 Session Bean 可以被压缩到一起。当然我们可以争辩依赖于 EJB 3 到底好不好,但为什么不呢?仅仅是因为 @Stateless 标注?

每个帖子都有大量的评论在添柴,比如 WarpedJavaGuy 说:

DAO 还长命着呢。持久化跟数据访问并不完全是一回事。

另一方的 Antonio Goncalves 回复说:

Java EE 的痛处是那些一遍又一遍重复的无聊代码,变成了反模式的设计模式,复杂性等等。在 EJB 里使用 EntitManager 的 CRUD 操作对我来说完全没有问题。对于简单的应用,我会跳过 DAO 模式……

总而言之,一般的公论是取决于应用和需求。 Adam 总结说

我会说:看情况。取决于你的应用到底有多复杂。

查看英文原文: Has JPA Killed the DAO?

2007-09-16 21:371960
用户头像

发布了 225 篇内容, 共 73.6 次阅读, 收获喜欢 52 次。

关注

评论

发布
暂无评论
发现更多内容

修改Tomcat窗口的名称

阡陌r

Java tomcat 踩坑 实施

Python 3.6.1 官方文档练习——初入江湖(三)

小匚

Python python教程

ARTS打卡 week 1

猫吃小怪兽

ARTS 打卡计划

【应用异常监控利器Sentry搭建与学习笔记】

卓丁

Docker Sertry Fasthttp CI/CD Go 语言

LeetCode 1048. Longest String Chain

liu_liu

LeetCode

我的读书生涯-小学到大学: 没有成长, 只有不断加深的疑惑

lmymirror

人生 读书 经历 半虚构

你所不知道的淘宝325秘密

Geek_i59t1w

ios 淘宝 325

鄙视链 & 全栈

伯薇

学习 能力提升 全栈

字节跳动:高级人才的五个基本素质

池建强

人才培养

Spring Data R2DBC 入门

稻草鸟人

MySQL WebFlux springboot R2DBC

leetcode练级-只出现一次的数字 升级版

幸福三寸日光

算法 LeetCode js

ARTS week 1

刘昱

游戏夜读 | 刀塔选手比较老吗?

game1night

ARTS 第一周

onee

ARTS 打卡计划

手把手透析C语言堆内存申请malloc及扩容realloc

卓丁

c 堆内存管理 heap memory malloc realloc

Mobileye如何在云上进行深度学习模型训练

Randy

自动驾驶 学习 AI AWS

职位拆解:互联网-运营

小鲸数据

行业资讯 移动互联网 运营 AARRR

John 易筋 ARTS打卡Week 01

John(易筋)

ARTS 打卡计划

leetcode练级-只出现一次的数字

幸福三寸日光

算法 LeetCode js

【ARTS】Week 1

Amos

ARTS 打卡计划

“数据资产”究竟是“数据”还是“资产”

马踏飞机747

大数据 数据中台 数据治理 数据资产

我的 Windows Terminal 配置

FeiLong

Windows Terminal

Lucene的Smart CN实现分词、停用词、扩展词

Page

中文分词 lucene 停用词 扩展词 SmartCN

Service Provider Interface介绍

Skysper

spi

ARTS 01 - 为什么写作在远程工作中那么重要?

Calvin

ARTS 打卡计划

Java 火焰图

wong

Java flamegraph

Linux如何调试内存泄漏

泰伦卢

c c++ C#

向往优雅的代码

Janenesome

编码习惯 读书

Kubernetes 资料集合

倪朋飞

学习 Kubernetes 架构模式

转行程序员浅谈Linux下的多线程编程

WB

Linux 程序员 多线程

LeetCode 241. Different Ways to Add Parentheses

liu_liu

LeetCode

DAO已死在JPA手上?_Java_Craig Wickesser_InfoQ精选文章