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

时间:2011-09-14 14:41:02

标签: nhibernate components nhibernate-mapping

我正在使用NHibernate一段时间,并且经常,当我需要映射子项完全依赖于其父项的父子集合时,我将这些关联映射为组件集合。

我一直认为,当孩子没有自己的生命周期时,他们应该被映射为组件,在逻辑上是正确的。但是我试图找到更接近实现级别的参数,我无法看到使用标准一对多映射我无法轻易获得的组件集合的任何收益。而且,我可以看到一些严重的缺点:

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

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

1 个答案:

答案 0 :(得分:1)

设计应用程序时,主要关注的是业务逻辑,这就是您需要使用实体和值对象设计域层的原因。

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

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

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

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

查看thisthis了解详情