NHibernate:映射到字段或者属性?

时间:2020-03-06 14:41:16  来源:igfitidea点击:

创建映射文件时,是否将属性映射到字段或者属性:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Foo" namespace="Foo.Bar" >
  <class name="Foo" table="FOOS" batch-size="100">
    [...]
    <property name="FooProperty1" access="field.camelcase" column="FOO_1" type="string" length="50" />
    <property name="FooProperty2" column="FOO_2" type="string" length="50" />
    [...]
  </class>
</hibernate-mapping>

当然,请说明原因:)

通常,我映射到属性,但是映射到字段可以使属性的getter / setter中加入一些"逻辑"。

映射到字段是否"不好"?有最佳实践吗?

解决方案

我映射到属性,没有遇到映射到字段的情况……当我拥有时,我会增加我的B.O。根据需要进行设计。我认为它允许更好的体系结构。

我映射到属性。如果我认为有必要,可以将SETTER映射到一个字段。 (通常通过" access = field.camelcase"之类的方式)。

这使我拥有美观的查询,例如"来自FirstName ='John'的人",而不是" From FirstName / _firstName的人",并且在给实体充水时也避免了设置逻辑。

我映射到属性,因为我使用自动属性。

除了集合(例如sets。我映射到字段(" access =" field.camelcase-underscore"`)之外的集合),因为我没有公开它们的公共属性,而是方法。

如果我们需要对数据进出持久性存储进行一些时髦的处理,则属性也很有用。通常应该避免这种情况,但是有时需要一些罕见的业务案例或者传统支持。

我倾向于同意以上答案。通常,映射到几乎所有内容的属性,然后映射到集合设置器的字段。
我们想要映射到字段的唯一其他地方是在我们拥有某些东西时:

public class AuditableEntity
{
   /*...*/
   DateTime creationDate = DateTime.Now;
   /*...*/
   public DateTime CreationDate { get { return creationDate; } }
}

空对象

如果我们要在类中实现空对象模式,则映射到字段会很有用。因为映射到属性时无法(轻松)执行此操作。我们最终不得不在数据库中存储伪造的对象。

高品质

我不确定使用HQL查询是否必须使用字段访问方法来更改属性名称。即,如果我们具有<property name =" FirstName" access =" field.camelcase" />,我想我们仍然可以编写" From From where where FirstName =:name";,因为它仍将使用属性名称。

有关场策略和Null对象的更多讨论可以在这里找到。

表现

关于约翰·查普曼(John Chapman)博客上的领域vs财产表现
看起来,中小型结果集的性能没有太大问题。

总而言之,每种方法都有一些优点,具体取决于情况(现场访问允许只读getter,不需要setter,当poco不需要特别要求且似乎是事实上的方法时,属性访问有效)

我直接映射到字段,这使我可以使用属性设置器来跟踪属性的脏状态。