【问题标题】:Java-EE6: How to design @Entity passing between tiers?Java-EE6:如何设计层间传递的@Entity?
【发布时间】:2012-05-03 08:02:57
【问题描述】:

我目前正在使用 Java-EE6(GlassFish 3.1.2、MySQL Server 5.1 和 Netbeans 7.1.1)开发 3 层应用程序。

该项目目前由3个项目组成:

  • 企业应用程序/EJB:控制数据库实体的外观
  • Java 类库:表示数据库模型的 @Entity 注释类(该项目由 EE 应用和胖客户端共享,以便在层之间交换实体实例)
  • J2SE Fat-Client:JNDI 查找服务器资源(远程访问 EJB)

为了在创建/修改/删除实体时更新客户端的 GUI,我决定通过实现一个主题来使用 JMS,其中每个客户端在启动时订阅,并且 EJB 容器上的消息驱动 bean 充当发布者。

现在我面临以下大问题:

  • 我将生命周期监听器(@PostUpdate 等)附加到实体对象,然后它们应该将更新消息发布到订阅的客户端。实体类位于 class-lib 项目中,而发布者位于 EE-app 中。问题是,EE 应用程序引用了类库项目,但反之亦然(因为不允许循环项目引用)。因此,实体类中的生命周期回调方法在 EE-app 中的消息驱动发布者 bean 上没有引用。

这是一个与设计更相关的问题,因此问您这是否是使用 Java-EE6 设计 3 层应用程序的正确方法?

我想尽可能避免使用 DTO/DAO,以尽可能降低复杂性,并且应用程序不会产生繁重的网络流量。

提前感谢您的建议!

【问题讨论】:

    标签: jakarta-ee entity 3-tier


    【解决方案1】:

    我通过在所有层之间直接传递@Entity 对象解决了这个问题。通过激活静态编织(使用 eclipse-link 作为 jpa 提供程序),我能够对重关系使用延迟获取。为了只从客户端获取特别重要的关系,我使用负载组来定义应该在通过网络序列化之前预获取的惰性关系,从而将实体与实体管理器分离。反之,再次将实体发送到服务器,我只是在服务器端外观上使用 EntityManager.merge(T) 将实体恢复为托管状态。即使对于非常复杂的数据层次结构,这种设计也能正常工作。

    【讨论】:

    • 您的意思是在 EJB 服务器上下文之外将@Entities 发送到胖客户端?但是这些实体是不可序列化的,因为关系是代理,你如何在没有 DTO 的情况下完成这项工作?
    猜你喜欢
    • 2012-03-25
    • 2017-09-04
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多