Nhibernate 组件集合-它有意义吗?

Nhibernate 组件集合-它有意义吗?,nhibernate,components,nhibernate-mapping,Nhibernate,Components,Nhibernate Mapping,我使用NHibernate已经有一段时间了,而且非常频繁,当我需要映射父-子集合时,其中的子集合完全依赖于它的父集合,我将这些关联映射为组件集合 我一直认为,当孩子们没有自己的生命周期时,他们应该被映射为组件,以便逻辑正确。但我试图找到更接近实现级别的参数,我看不到组件集合有任何好处,而使用标准的一对多映射很难获得这些好处。此外,我可以看到一些严重的缺点: 这样的集合中的组件总是在每次更新时被删除并重新插入,当集合包含数百个元素时,这可能会对性能造成很大影响 默认情况下生成的模式使用不带主键的

我使用NHibernate已经有一段时间了,而且非常频繁,当我需要映射父-子集合时,其中的子集合完全依赖于它的父集合,我将这些关联映射为组件集合

我一直认为,当孩子们没有自己的生命周期时,他们应该被映射为组件,以便逻辑正确。但我试图找到更接近实现级别的参数,我看不到组件集合有任何好处,而使用标准的一对多映射很难获得这些好处。此外,我可以看到一些严重的缺点:

  • 这样的集合中的组件总是在每次更新时被删除并重新插入,当集合包含数百个元素时,这可能会对性能造成很大影响
  • 默认情况下生成的模式使用不带主键的表来保存组件-这违反了数据库良好实践

使组件集合映射真正有用的真实场景是什么?

当您设计应用程序时,您的主要关注点应该是业务逻辑,这就是为什么您需要使用实体和值对象设计域层

当您以这种方式设计应用程序时,您将对象实现为具有不可变的标识或值对象的实体,将标识添加到颜色对象或用户地址对象(除非它是装运应用程序等)是不符合逻辑的

您应该将域模型设计为尽可能与持久性无关,以抽象出技术数据存储并专注于业务逻辑,这是应用程序的主要目标

当您使用类似于NHibernate的orm实现映射层时,您将值对象映射为组件,因为它们没有标识,并且破坏域并将标识仅仅用于持久性是不符合逻辑的。还要考虑这些组件的不变性,当您更改颜色或地址时,实际上并不是在修改它,而是在替换它,因为值对象通常很小,添加显式id即使在数据库方面也不会增加任何好处,因为您不需要为它们编制索引,按id查找它们,甚至单独查询它们,因此添加id只会使存储复杂化

如果您发现您的组件集合相当大或复杂,那么您可能误用了value对象,您可能需要重新设计它或将其转换为具有标识的实体

查看并获取更多详细信息