is DTO an antipattern in EJB 3.0 ?

news/2024/7/5 6:18:08


這個問題應該是從 Raghu Kodali's blog 開始的

http://www.jroller.com/page/raghukodali?entry=dto_an_antipattern_in_ejb

Raghu 的論述主要在於, Design Pattern 中的 Data Transfer Objects (DTO) 原本是要避免重新取得舊有的 EJB2.x 的遠端呼叫時間, 讓 DTO 封裝資料後送到客戶端處理. 不過,  當資料量過大的時候, DTOs 卻顯得龐大而難用, 一股腦地將所有資料封裝整堆送到客戶端.. 這難道是唯一的方法嗎 ?

因為 Java Persistence API (ejb3 entities) 目前就是一個 POJO , 為何需要重新建立一個 DTO 呢? 利用 EntityManager 便可以簡單地透過 create/ remove/ find 以及 query 的方式來存取需要的資料, 也可以利用 merge 的方式來更改 Object 的狀況. 因為 EJB3.0 的 persistence 可以定義為 Attached/Detached/Reattached 到資料庫之中, 因此, 讓 client 擁有 detached entities 就可以取代了 DTOs  .

基本上, 以客觀的角度認為, DTOs 面對 Detached Objects 的 entities, 顯得比較沒有意義, 不過, 不使用 DTOs 這種方式可能會造成另一個麻煩, 就會讓 Transaction 的動作交到 client-tier 作處理, 如果屬於 @OneToMany 的 Objects, 我被迫一定得利用 EAGER 的方式讓所有的資料產出, 而無法採用 LAZY 的模式進行關聯式存取.

換句話說, 我們原本可以在 SessionBean 同一個 Transaction 之中過濾相關的資料, 以 Lazy 的模式取得應該要的資料, 將有效的資料放到 DTOs 再拋給 Client-Tier..

然而, 因為 PersistenceContext 可以設定為 TransactionScope 或 extended, 往往 Stateless 是設定為 TransactionScope, Stateful 是設定為 extended, 就是希望 Stateful 的情況, 無須重新取得 PersistenceContext . 不過不用太擔心 Stateless TransactionScope 的狀況, 因為 Detached Lifecycle 是可以透過 merge 的方式回到 Managed 的 Lifecycle 之中.

總結 ~

在一般狀況來看, 資料量與關聯性都不高的情況, 我們利用 Detached Object 取代 DTOs 的確無可厚非, 但是如果會因為關聯性取得大量資料, 想使用 LAZY 的 FetchType, 在同一個 Transaction 之中處理完畢, 那麼, DTOs 就是比較好的 Patterns.  因此, is DTO an antipattern in EJB3.0 ? 看你的系統整體架構吧 !

 

 

 

 

 





http://www.niftyadmin.cn/n/3653814.html

相关文章

ORA-12537 TNS connection closed错误处理过程

1,同事说oracle测试换了连接不上了,报错如下[oraclepldb236 admin]$ rlwrap sqlplus powerdesk/pd141118PD236SQL*Plus: Release 11.2.0.1.0 Production on Mon Nov 23 14:16:31 2015Copyright (c) 1982, 2009, Oracle. All rights reserved.ERROR:ORA-…

JSF1.2 in JavaEE5 

Chapter 1 JSF 1.2 overviewJSF ( Java Server Faces ) 在 JavaEE5 之中, 是採用 1.2 的版本. 目前的 RI 僅有 SUN 釋出的版本, 並且可以使用在 NetBeans 5.5 與 Glassfish 之中. 主要來說, 簡化了相關的開發方式, 以及 Scoped Managed Bean 可以利用 Annotation 的方式快速存取…

BPM introduction

以往, 大家對於流程控管, 似乎都是稱之為 Workflow, 然而, 專門控制流程的會稱之為 FlowEngine. 所以想要了解接下來我所引導介紹的章節, 大家可以先行閱讀 TSS 的這篇文章. BPEL and Java .在 Java Opensource 的流程控管系統中, 當中有幾個重要的 flow engine .jBPM ( http:/…

開始來玩 jBPM

如果沒有特別的需求,可以直接下載 JBoss jBPM Starters Kit. 裡面其實就包含了 JBoss Application Server 以及 JBoss jBPM. 因為 jBPM 是採用 Hibernate 存取資料庫, 所以裡面也有 Hibernate 等元件. 如果你已經要將 jBPM 部署在其他的 Application Server 之上, 僅…

zabbix3 0 2 使用percona mysql插件来监控mysql5 7的详细实现过程

--前言上次用了zabbix自带的mysql插件来监控mysql数据库,但是太过简陋了,对于我们dba来说,基本没有啥作用,所以需要做更详细的监控,而percona就有这个详细监控的模版以及脚本,正好拿过来用。1, …

Lesson1:透過 commons-configuration 存取設定檔

在我們撰寫一些系統的時候,往往需要設定一些基本的屬性,在使用 Java 進行 Web 開發之中,可以將相關設定放在 JNDI Server 再透過 context lookup 重量級的方式來取得相關的屬性。不過,有時候簡單的環境,不必耗時耗力去…

MySQL 用户权限详细汇总

1,MySQL权限体系mysql 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。GRANT ALL ON .和REVOKE ALL ON .只授予和撤销全局权限。 数据库层级: 数据库权限适用于一个给定数…

MySQL 5 7 10最新版本源代码安装详细过程

1,下载地址:安装包下载地址:http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.10.tar.gz可以wget下载,也可以在pc本地网页上下载完再远程传到linux上面去。 安装文档地址:http://dev.mysql.com/doc/refman/5.7…