持久和瞬态对象 - 对术语感到困惑
Posted
技术标签:
【中文标题】持久和瞬态对象 - 对术语感到困惑【英文标题】:Persistent and transient objects - confused about terminology 【发布时间】:2012-07-12 14:19:23 【问题描述】:这是我对这两个术语的定义,虽然我不确定它是否完整:
一个持久对象是领域模型中的一个类的实例 表示从数据库中提取的一些信息。一种 transient object是领域模型中类的一个实例,在内存中创建
a) 我假设术语 persistent 和 transient 仅用于域模型中的对象,但不适用于位于域模型之外的业务层中的对象?
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 数据库将持久对象永久存储在二级存储中,并允许在多个程序和应用程序之间共享这些对象。
【讨论】:
以上是关于持久和瞬态对象 - 对术语感到困惑的主要内容,如果未能解决你的问题,请参考以下文章