使用 ORM 时,如何安全地跨层发送加载的实体
Posted
技术标签:
【中文标题】使用 ORM 时,如何安全地跨层发送加载的实体【英文标题】:When using an ORM, how to safely send loaded entities across the tiers 【发布时间】:2008-09-17 22:05:47 【问题描述】:当系统有 N 层时,当使用 ORM 时,如何跨层发送加载的实体?
你使用 DTO 吗?
当不使用DTO,直接发送实体时,如何防范未初始化的延迟加载关系错误?
注意:这不是“应该使用 N 层吗?”问题。我假设系统已经有 N 层了。
【问题讨论】:
【参考方案1】:我不知道是否有更好的方法,但是当我们使用 Hibernate 时,我们只是关闭延迟加载,以便它加载所有内容。这样做显然要花费更多,但我不确定如何摆脱 Hibernate 将创建的延迟加载方法。
如果一个容器有一组不经常使用的数据,那么它们将不会被加载,由请求 UI 表单来调用它并发送它以进行更新。 (我们构建了更新类来一起传递所有信息)
对于加载大量容器的 UI 表单,我们只需创建特殊类并填写我们需要的内容。它们是一种不用于持久性的只读容器。
可能有更好的方法..但我正在学习:)
【讨论】:
【参考方案2】:我只是想用 ORM 找到自己的方式。
这是一个吸引人的概念。像您一样,我不希望应用程序中的其他层知道 ORM 存在。
我目前正在查看的是使用我设计的接口和使用部分类(C#/.net 的东西,没有部分类,我想我会编写一个包装器)将接口的实现添加到类型上由 ORM 生成。
就延迟加载/延迟执行而言,应用程序也应该不可见。这是 ORM 提供的一项很好的服务,我很高兴它提供了,但我的应用程序不需要知道或关心它。因此,如果 ORM 没有向您隐藏它,那么我会再次查看一个处理此问题的包装器,以便应用程序不需要知道或关心。
【讨论】:
以上是关于使用 ORM 时,如何安全地跨层发送加载的实体的主要内容,如果未能解决你的问题,请参考以下文章
加载关系时如何指示SQLAlchemy ORM并行执行多个查询?
如何在更新数据库和应用程序 ORM 时最小化应用程序停机时间
simplexml_load_file():I/O 警告:未能加载外部实体“/user-bundle/Resources/config/doctrine/model/User.orm.xml