持久和瞬态对象 - 对术语感到困惑

Posted

技术标签:

【中文标题】持久和瞬态对象 - 对术语感到困惑【英文标题】:Persistent and transient objects - confused about terminology 【发布时间】:2012-07-12 14:19:23 【问题描述】:

这是我对这两个术语的定义,虽然我不确定它是否完整:

一个持久对象是领域模型中的一个类的实例 表示从数据库中提取的一些信息。一种 transient object是领域模型中类的一个实例,在内存中创建

a) 我假设术语 persistenttransient 仅用于域模型中的对象,但不适用于位于域模型之外的业务层中的对象?

b) 我们是否也对 Data-Transfer-Objects 使用这两个术语?

c) 这两个术语是否也用于值对象

谢谢

【问题讨论】:

【参考方案1】:

持久表示对象已保存到数据库中,而瞬变表示尚未保存。因此,例如,当您从存储库中获取实体时,该实体是持久的。当您创建一个新实体时,它是暂时的,直到持久化。

a) 这些术语与 ORM 的关联性比与 DDD 的关联性更高,因此它们适用于任何非 DDD。在 DDD 中持久化/瞬态适用于实体和聚合根,因为这些是与存储库一起持久化的对象。

b) 不,DTO 旨在跨进程边界传输数据,并且没有您希望持久保存到数据库的对象所具有的生命周期。

c) 否,因为值对象没有标识,只能作为实体或聚合根的一部分持久化。值对象只是一个值,就像 1 是一个整数值一样,谈论它是否持久化是没有意义的。

【讨论】:

你回答了我的问题,所以我会在一天内将其标记为已回答。但是,如果您找到一些时间来帮助我更多:“不,因为值对象没有身份,只能作为实体或聚合根的一部分持久化。”我们不使用这两个术语来表示值对象即使它有自己的数据库表? ORM 根据其标识符(或版本)的值确定对象的持久/临时状态。鉴于值对象没有 ID,ORM 不会对值对象做出决定——所有值对象都通过根实体持久化。如果你直接持久化值对象,那么它们就不是真正的值对象。【参考方案2】:

Transient 表示未处理的对象或实例化或新创建的对象。一旦对象被提交以进行除对象状态之外的任何其他操作,则该对象状态是已知的持久性

【讨论】:

【参考方案3】:

一个对象通常有两个组成部分:状态(值)和行为(操作)。它可以有复杂的数据结构以及程序员定义的特定操作。9 OOPL 中的对象只存在于程序执行期间;因此,它们被称为瞬态对象。 OO 数据库可以扩展对象的存在,以便将它们永久存储在数据库中,因此对象成为在程序终止之后存在的持久对象,并且可以稍后检索并由其他程序共享。换句话说,OO 数据库将持久对象永久存储在二级存储中,并允许在多个程序和应用程序之间共享这些对象。

【讨论】:

以上是关于持久和瞬态对象 - 对术语感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

对反应模式/架构感到困惑

异步和同步术语

AWS RDS Postgres、GORM 和瞬态错误

弹性和瞬态故障处理库Polly

对 cloudFront 中的最小、最大和默认 TTL 感到困惑

Xml 转义/编码术语