当 属性 值来自引用 table 时,您应该如何填充实体(bean)对象 属性?

How should you populate an entity (bean) object property when the property value comes from a reference table?

假设您有一个名为 Business 的实体对象,其属性如 businessIDbusinessNameentityTypeentityTypeName。与所有相关 setters/getters.

entityType 属性 是一个整数,表示与引用 table 的外键 (FK) 关系,其中包含所有可能的实体类型(公司、有限责任公司、独资企业, ETC...)。数据库图如下所示:

当从 CRUD read() 方法填充 Business 实体时,它会通过 DAO(数据访问对象)中的 INNER JOIN 自动获取正确的 entityTypeName 并通过 setEntityTypeName()。这个过程对我来说很有意义,据我所知似乎很标准。

但是,假设您有一个 Web 表单,用户可以在其中编辑 Business 实体对象。用户填写一个表单,他们可以在其中根据 select 可用选项框(根据参考 table 填充)编辑公司名称和实体类型。

当用户提交表单时,将验证数据,然后服务对象使用表单中的值执行 setBusinessName()。接下来,它执行 setEntityType() 并从实体类型 select 框中填充整数值。 此时,entityTypeName 可能有效也可能无效(例如,如果用户更改了它)。

我可以想到几种方法来解决这个问题:

  1. 同一个表单服务,在执行完setEntityType()后,会立即执行setEntityTypeName(),并填充正确的值。 (我认为最简单的方法,因为验证过程会检索正确的实体类型名称)

  2. Business 实体的 setEntityType() 方法包含业务逻辑,通过某种类型的注入依赖项(服务)自动填充 entityTypeName 属性会查找数据并分配它。 (这似乎是一种更 DDD 的方法)并且会使 Business 实体对象需要更多的行为和依赖性(服务等...)。

解决这种情况的正确方法是什么?显然这是一个简单的例子,但在实际的数据模型中,可能有大量参考字段,如 entityType,这需要这样的行为。

编辑:语法修复

你不会。

看起来您正在将 UI 需求混合到您的域模型中。使用专用的视图模型来呈现数据,您的领域模型应该只在事情完成后发挥作用。

我建议 EntityTypeName 不属于 BusinessEntityType 是它自己的聚合根,Business 可能只需要引用 EntityType.Id

你的setter可以改成:

SetEntityType(EntityType entity) {
   //Any rules here based on entity?
  entityTypeId = entityType.GetId();
}