繁体   English   中英

这个ORM模式叫什么

[英]What is this ORM pattern called

我已经习惯了像JPA这样的框架来在数据库行和Java对象之间进行对象关系映射。

但是,在我的公司中,我们为ORM使用专有框架,该框架不使用实体类来表示实体,而仅使用java.util.Map类将数据库列值映射到其名称。

通常,此类地图还可以用作表示层的模型以呈现表单。 再次发布表单会将参数作为映射注入到处理程序方法中。 这是2000年代初期的旧框架。

甚至以为在实体类上使用映射会闻到过时和反模式的味道,我实际上喜欢此模型的“动态”性质。 您可以轻松地将任何数据添加到业务逻辑层中的地图上,然后再将其传递到表示层,并且只需更改模板本身,它就成为表单的一部分。 如有必要,它允许您使用任何内容扩充任何实体。 如果您必须在特定条件下显示特定字段的特定通知,这最终将很有用。 您只需检查条件,必要时将通知添加到地图,如果地图中存在通知,则在模板中进行渲染。 如果使用实体类,则需要使用属性来重构实体类接口,该属性甚至不是实体的真实属性。 业务逻辑充满了这些特殊条件,并且它们在不断发展。

这是危险的想法吗-我是否愿意采取反模式? 还是有理由在复杂的业务领域中使用这种模式,并且这种模式有名称吗?

我不知道适合您描述的模式,但是在实体类上使用Map也会有缺点。

您可以轻松地将任何数据添加到业务逻辑层中的地图上,然后再将其传递到表示层,并且只需更改模板本身,它就成为表单的一部分。

您所看到的优势意味着您永远无法确定Map处于哪种状态。 如果通过服务1加载实体,则映射可能包含一些值。 如果您通过另一个服务2加载同一实体,则该实体可能不包含某些值。 Map的状态是特定于用例的。

由于您正在使用Map因此从客户端的角度来看,这也意味着每个属性都具有相同的类型,例如Map<String, Object> 因此,如果您在代码中看到一个实体映射,则还必须知道它具有哪种类型。 在不知道例如很难计算总订单的情况下。

只要您是唯一处理该代码的人,并且知道所有Map状态,您就会认为它是灵活而快速的。 如果一段时间未使用此类代码,则可能会忘记Map可能具有的不同状态。 然后,您必须遍历每个用例的整个代码,以查看是否有一段代码添加或删除了属性或仅替换了属性类型。

因此,请尝试从文档角度考虑该设计。 专用实体类的最大优点是它被命名。 您可以给一个班级起一个名字,也就给它一个含义。 例如

public class PlacedOrder { ... }
public class Refund { ... }

您也可以轻松地将javadoc添加到该类中,以提供有关该类在您的上下文中的含义的更多详细信息。 这通常称为Ubiquitous Language 我经常只使用术语“域语言”,因为它说起来更容易。

以我的经验,这种设计通常会导致系统难以维护。 刚开始时,代码库很小,所以您真的很快。 但这并不令人惊奇,因为您经常通过不应用干净的代码原理来节省文档时间。

由于编译器无法检查类型,因此仅在运行时会发现类型问题。 这意味着您必须创建一个强大的测试工具 ,因为测试还必须发现编译器可能报告的错误。 或者,您只是开发尝试和错误的方式,但这不是我的方式,也不会让我满意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM