1

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

该项目目前包括3个项目:

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

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

现在我面临以下大问题:

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

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

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

提前感谢您的建议!

4

1 回答 1

0

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

于 2012-10-24T08:14:35.067 回答