将Presentation Modal对象传递到服务和业务层

时间:2017-01-30 18:20:32

标签: java hibernate struts2

我正在使用struts2 EJB3(服务/业务层)和Hibernate开发Web应用程序。我使用Wildfly 10作为服务器。 Struts稍后会介绍,EJB3在业务层,简单的java类作为Service层,hibernate稍后用于持久化。 现在在我的一个动作类中,我将模态对象传递给服务层(简单的java类)。现在,当我创建EAR并尝试将其部署在WIldfly上时。威尔德夫拒绝开始。然后我意识到我的ejb模块无法找到Web模块的类。所以现在我有两种方法来解决这个问题: -

1)在EJB jar中包含我的Web类: - 我认为它将完全破坏分层体系结构并将表示层和服务层分离。

2)或者将模态类映射到服务层中存在的其他模态类: - 它还需要在服务层中创建冗余的POJO类。

在这种情况下,我真的不知道该怎么办?如果someboddy可以建议我使用更好的分层结构

1 个答案:

答案 0 :(得分:0)

您可以通过多种方式为每个图层构建模型,但在一天结束时,这取决于您希望将每个图层彼此耦合的程度。

显然,最精细和最干净的解决方案是允许每个层拥有自己的模型,并在每个集成点进行相应的映射。

  1. 持久性模型,例如你的@Entity班级
  2. 域模型,例如那些服务层作为输入并作为输出返回。
  3. 查看模型,例如那些你的表示层作为输入并作为输出返回。
  4. 这种区别的优势在于它允许每个级别的模型随时间变化而不会对其上方的层产生显着影响。换句话说,添加新字段或使用持久性模型更改某些内容并不一定意味着您的域模型必须更改,而只是更改它们之间的映射代码。

    显然互联网上有很多来源主张简单地重复使用@Entity类作为每层的模型,对于简单的应用程序,这绝对是可以接受的。但在更复杂,可扩展的解决方案中,最终会成为一种负担。

    有时将(1)和(2)折叠成单个模型@Entity然后使用特殊视图模型进行渲染是可以接受的,因此当您进行模型更改时,至少您的视图代码不会受到影响 - 时间,但我通常会错误地在复杂应用程序的许多情况下为所有三层使用不同的模型。