2011-06-17 79 views
4

我正在开发一个为客户端和浏览器提供服务的服务器系统,我决定使用JPA处理数据库存储的OR/Mapping。这导致实体Bean类暴露给客户端,因此我尝试通过使用值对象和数据传输对象来避免这种设计。这意味着我需要POJO,以及在不同的系统轮胎上交换POJO和Entity Bean类的机制。如何将实体Bean转换为值对象?

我的问题是,有没有任何成熟的设计模式或EJB指定的服务可以自动做到这一点?我真的很讨厌设计一些难以解耦和更新的POJO - Entity Bean一对一映射。

在此先感谢

回答

2

你可能想看看Dozer,使用反射来映射基于字段名称豆豆映射。它为您提供了一些防止更改的保护措施,因为如果一个类发生更改,您总是可以手动指定映射,但是您希望保持映射的类相同。

+0

感谢您的帮助,artbristol,我现在正在学习Dozer,看看是否符合我的需求。同时,我想到JavaCompiler和Reflection动态地做所有事情:) – Korben 2011-06-17 10:39:42

4

这导致实体Bean类 暴露给客户端,因此我尝试通过使用值对象和数据传输对象来避免此类设计。

为什么?什么问题证明了这种残酷的代码重复?

“数据传输对象”和“值对象”名称的错误用法是EJB 2实体Bean必需的反模式,以避免过多的服务器往返。

如果你使用JPA,你不需要实体bean。您的实体 POJO,将它们暴露给客户绝对没有错 - 事实上这是关于JPA最好的事情之一。

+0

是的,我不得不承认我提出了一个非常糟糕的问题。我是EJB的新手。感谢你的信息。 – Korben 2011-06-17 14:47:41

+1

因为视图不需要知道它基于的每个实体或数据库表。所以如果你改变你的持久性方法,你不必重写你的用户界面。与使用O/R映射抽象数据库调用的原因相同。 – BillR 2012-06-14 16:27:16

+0

@BillR:*当然*你的观点必须知道它所基于的实体,否则它不能做任何事情。而且这不像是视图会意外地使用反射来访问JPA注释并依赖它们。有趣的是,你应该提及O/R映射 - 这就是JPA。因此,“改变数据库中期项目”案例已经被覆盖 - 尽管这从来没有真正发生过,当然也不是使用OR映射器的主要原因。它们用于避免编写大量重复的CRUD代码。 – 2012-06-14 21:04:32