【问题标题】:How to send data from session beans to presentation tier?如何将数据从会话 bean 发送到表示层?
【发布时间】:2012-06-21 09:43:01
【问题描述】:

我开发了一个具有 4 层的 Java 应用程序:数据库 (MySQL)、持久性 (JPA)、业务(类似于 EJB 中的无状态会话 bean 的 POJO)、表示(Java Swing)。

我决定完全分离表示层和持久层。因此,对所有数据的所有修改都通过业务层完成。这样,表示层甚至不知道实体类的存在。这也允许会话 bean 更好地控制传递的数据,因为有时会话 bean 需要在更改实体之前验证或转换从表示接收的值

但是,有时会话 bean 需要向调用者发送大量信息(例如具有大量属性的实体列表)。这变得复杂了,因为根据我采用的会话 bean 的设计,需要将所有这些实体解包到其他东西中。我试图将实体列表转换为数组列表(其中数组的每个成员对应于实体中的一个属性),但这似乎有缺陷,容易出错且效率低下我。

将数据发送到演示文稿的正确方法是什么?将实体隐藏在会话 bean 后面的概念是否有意义?此类应用程序中的常见模式是什么?

【问题讨论】:

    标签: java design-patterns ejb n-tier-architecture


    【解决方案1】:

    常见的模式是在符合要求时使用 JPA 实体(即,当它们包含表示层所需的数据时,并且当您不需要获取数据库的一半来返回此数据时),并且当实体不符合要求时使用 DTO(数据传输对象,它只是包含所需信息的 POJO)。

    有些人喜欢只使用 DTO,就像您正在做的那样。但是 DTO 应该是具有类型属性的真实对象。数组列表难以理解和维护,不提供任何类型的类型安全和编译检查,并且通常需要 JavaBeans 的经典表示层技术(JSP EL 等)不容易使用。

    【讨论】:

    • 将 JPA 实体发送到远程客户端的一个问题是,您还要发送技术 PK,而不仅仅是业务密钥。特别是如果允许用户更新数据,您必须确保在重新附加实体时使用(而不是操纵)正确的 PK。 DTO 通过仅发送用户需要的数据(可能涉及业务密钥,但不涉及代理 PK)使这个问题更加清晰。
    • 什么会阻止他们操纵业务密钥?我在这里看不出有什么不同。顺便说一句,有很多实体没有任何业务密钥。
    • PK = 主键。是的,一个分离的实体是一个很好的 DTO。只需确保在每个返回分离实体的服务方法中记录哪些关联已初始化,哪些未初始化。
    【解决方案2】:

    将实体隐藏在会话 bean 后面的概念是否使 有什么意义吗?此类应用程序中的常见模式是什么?

    是的,如果客户端在不同的 JVM(远程)上运行,我建议发送 DTO(设计模式;数据传输对象)而不是 JPA 实体。

    您可能正在寻找的 EJB 设计模式是:Service Facade 目标是提供粗粒度的、客户端/用例特定的 API。

    Adam Bien 写了一本关于 Java EE 5/6 设计模式的书: http://press.adam-bien.com/real-world-java-ee-patterns-rethinking-best-practices.htm

    只发送用户可以方便处理的尽可能多的数据,例如使用过滤或分页技术。

    【讨论】:

    • 你同时推荐 DTO 和 Adam Bien 的书有点奇怪,因为你链接到的页面上写着:“讨论多余的模式和过时的最佳实践,如 [...] Data转移对象”
    • 嗯,在本书中,远程 EJB 是例外而不是规则。如果您正在编写一个 Web 应用程序,其中 Web 前端在同一个 JVM 中运行,您通常最好使用网关模式,它使用附加的 JPA 实体,而不是使用 DTO。但如果您使用远程 EJB 或 Web 服务(在 WSDL/XSD 中定义 DTO),我不建议使用 JPA 实体。
    • 同意。但是 OP 没有使用远程 EJB。
    • 好吧,OP 正在谈论 EJB 和 Swing。所以我猜是远程 EJB,因为没有提到 Web 服务或其他技术。
    猜你喜欢
    • 2013-03-17
    • 2019-06-21
    • 1970-01-01
    • 2016-07-10
    • 2011-04-19
    • 2017-10-18
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多