【问题标题】:Design of layered architecture for a Java applicationJava应用程序的分层架构设计
【发布时间】:2014-06-20 03:37:08
【问题描述】:

我的代码具有以下架构:

  1. 业务对象(代表业务对象 [BO])
  2. DataBasedModel 类(映射到数据库表)

分层架构

  1. DAO(将 BO 读/写到 DB,将 BO 转换为 DBModel,反之亦然)
  2. 每个表都有一个 DAO
  3. 我计划在 DAO 之上有一个管理层。Manager 将调用 DAOS。Manager 处理业务逻辑和事务

假设我有 3 个表:A、B、C

  1. BO:是 A_BO ,B_BO ,C_BO
  2. 经理:A_M、B_M、C_M
  3. DAO:A_DAO、B_DAO、C_DAO

BO的所有写操作都由各自的Manager处理(例如要写入A_BO,总是调用Manager A)。

对于某些操作,我需要访问多个表/BO。

例如要在 A 中插入一条记录,我需要在表 B 中检查一些内容。A 的写入由托管的 A 处理。

经理 A 可以调用 B_DAO 吗?还是应该只调用 B_Manager?并且不访问 B_DAO?

一些担忧:

如果经理调用其他经理,我不能在经理上放置@Transaction 注释,然后我需要在经理之上再增加一层。

【问题讨论】:

  • 您可以将@Transaction 放在管理器方法上,即使它调用另一个管理器的@Transactional 方法。第二种方法将参与第一种方法的事务。
  • 这将导致嵌套事务权限并异常失败
  • @我的问题是不是太愚蠢了?没有人回答 :(。我想知道你们的意见,因为我在 delema 中
  • 除非明确使用嵌套传播模式,否则不会产生嵌套事务。此外,嵌套事务并不总是失败,如果它们总是失败,它们就不会存在。
  • 如果它已经存在,我如何防止它使用相同的事务?使用propagation=Propagation.REQUIRED??

标签: java architecture


【解决方案1】:

我没有看到您的 DAO 层和管理器层的区别。他们似乎肩负着同样的责任:管理实体。

另一方面,我错过了诸如业务层之类的东西。在业务逻辑中,您将拥有需要访问多个实体的用例。例如,要存储新账单,您将获得账单数据、客户账户、仓库库存和许多其他实体的更新。所有这些更新都应该发生在一个事务中。因此,您应该将当前 DAO 和管理器层中定义的所有功能视为一个持久层,该功能只能在事务内部使用。每个实体有一个 DAO 是一种常见的模式。

事务应该由某个业务层触发,其中提供的功能对您的应用程序逻辑有帮助。这也是可以实现事务划分和权限检查等其他方面的点。

【讨论】:

  • @Blafasel.Yes 。但是我可以从 A 的经理那里打电话给 B 的 dao 吗?如果 A 经理想在 B 中检查某些内容?
  • @user93796 当然可以。您应该避免从经理到经理的电话,以避免事务划分中的问题。将常用功能分解为一些不属于公共接口的公共或实用程序类是这里的常见模式。
  • @Abhinav : 任何 cmets?
  • 可以请你加入我们chat.stackoverflow.com/rooms/51937/…
猜你喜欢
  • 2019-01-27
  • 2018-09-26
  • 2013-12-29
  • 1970-01-01
  • 2019-12-23
  • 2016-03-26
  • 2023-03-25
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多