Java-EE6:如何设计层之间传递的@Entity?

时间:2012-04-22 13:09:24

标签: java-ee entity 3-tier

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

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

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

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

现在我面临以下重大问题:

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

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

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

提前感谢您的建议!

1 个答案:

答案 0 :(得分:0)

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