当 属性 值来自引用 table 时,您应该如何填充实体(bean)对象 属性?
How should you populate an entity (bean) object property when the property value comes from a reference table?
假设您有一个名为 Business
的实体对象,其属性如 businessID
、businessName
、entityType
和 entityTypeName
。与所有相关 setters/getters.
entityType
属性 是一个整数,表示与引用 table 的外键 (FK) 关系,其中包含所有可能的实体类型(公司、有限责任公司、独资企业, ETC...)。数据库图如下所示:
当从 CRUD read() 方法填充 Business
实体时,它会通过 DAO(数据访问对象)中的 INNER JOIN 自动获取正确的 entityTypeName
并通过 setEntityTypeName()
。这个过程对我来说很有意义,据我所知似乎很标准。
但是,假设您有一个 Web 表单,用户可以在其中编辑 Business
实体对象。用户填写一个表单,他们可以在其中根据 select 可用选项框(根据参考 table 填充)编辑公司名称和实体类型。
当用户提交表单时,将验证数据,然后服务对象使用表单中的值执行 setBusinessName()
。接下来,它执行 setEntityType()
并从实体类型 select 框中填充整数值。 此时,entityTypeName
可能有效也可能无效(例如,如果用户更改了它)。
我可以想到几种方法来解决这个问题:
同一个表单服务,在执行完setEntityType()
后,会立即执行setEntityTypeName()
,并填充正确的值。 (我认为最简单的方法,因为验证过程会检索正确的实体类型名称)
Business
实体的 setEntityType()
方法包含业务逻辑,通过某种类型的注入依赖项(服务)自动填充 entityTypeName
属性会查找数据并分配它。 (这似乎是一种更 DDD 的方法)并且会使 Business
实体对象需要更多的行为和依赖性(服务等...)。
解决这种情况的正确方法是什么?显然这是一个简单的例子,但在实际的数据模型中,可能有大量参考字段,如 entityType
,这需要这样的行为。
编辑:语法修复
你不会。
看起来您正在将 UI 需求混合到您的域模型中。使用专用的视图模型来呈现数据,您的领域模型应该只在事情完成后发挥作用。
我建议 EntityTypeName
不属于 Business
。 EntityType
是它自己的聚合根,Business
可能只需要引用 EntityType.Id
。
你的setter可以改成:
SetEntityType(EntityType entity) {
//Any rules here based on entity?
entityTypeId = entityType.GetId();
}
假设您有一个名为 Business
的实体对象,其属性如 businessID
、businessName
、entityType
和 entityTypeName
。与所有相关 setters/getters.
entityType
属性 是一个整数,表示与引用 table 的外键 (FK) 关系,其中包含所有可能的实体类型(公司、有限责任公司、独资企业, ETC...)。数据库图如下所示:
当从 CRUD read() 方法填充 Business
实体时,它会通过 DAO(数据访问对象)中的 INNER JOIN 自动获取正确的 entityTypeName
并通过 setEntityTypeName()
。这个过程对我来说很有意义,据我所知似乎很标准。
但是,假设您有一个 Web 表单,用户可以在其中编辑 Business
实体对象。用户填写一个表单,他们可以在其中根据 select 可用选项框(根据参考 table 填充)编辑公司名称和实体类型。
当用户提交表单时,将验证数据,然后服务对象使用表单中的值执行 setBusinessName()
。接下来,它执行 setEntityType()
并从实体类型 select 框中填充整数值。 此时,entityTypeName
可能有效也可能无效(例如,如果用户更改了它)。
我可以想到几种方法来解决这个问题:
同一个表单服务,在执行完
setEntityType()
后,会立即执行setEntityTypeName()
,并填充正确的值。 (我认为最简单的方法,因为验证过程会检索正确的实体类型名称)Business
实体的setEntityType()
方法包含业务逻辑,通过某种类型的注入依赖项(服务)自动填充entityTypeName
属性会查找数据并分配它。 (这似乎是一种更 DDD 的方法)并且会使Business
实体对象需要更多的行为和依赖性(服务等...)。
解决这种情况的正确方法是什么?显然这是一个简单的例子,但在实际的数据模型中,可能有大量参考字段,如 entityType
,这需要这样的行为。
编辑:语法修复
你不会。
看起来您正在将 UI 需求混合到您的域模型中。使用专用的视图模型来呈现数据,您的领域模型应该只在事情完成后发挥作用。
我建议 EntityTypeName
不属于 Business
。 EntityType
是它自己的聚合根,Business
可能只需要引用 EntityType.Id
。
你的setter可以改成:
SetEntityType(EntityType entity) {
//Any rules here based on entity?
entityTypeId = entityType.GetId();
}