12

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

<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 中放置一些“逻辑”。

映射到字段是否“不好”?有最佳做法吗?

4

7 回答 7

5

我映射到属性。如果我觉得有必要,我会将 SETTER 映射到一个字段。(通常通过“access=field.camelcase”之类的东西)。

这让我有漂亮的查询,例如“来自 FirstName = 'John' 的人”而不是像“来自 FirstName/_firstName 的人”之类的东西,并且在为我的实体补水时也避免了 setter 逻辑。

于 2008-09-24T20:36:20.987 回答
2

如果您需要对进出持久存储的数据进行一些时髦的处理,属性也很有用。通常应该避免这种情况,但一些罕见的业务案例或遗留支持有时会要求这样做。

(请记住,如果您在使用 getter 时以某种方式转换数据,NHibernate 将(默认情况下)使用 getter 的返回并在 Session 刷新/关闭时将其保存回数据库。确保这就是你想要的。)

于 2008-09-26T03:26:43.270 回答
1

我映射到属性,我还没有遇到我会映射到字段的情况......当我有我的需要时,我会增加我的 BO 设计。我认为它允许更好的架构。

于 2008-09-24T20:35:01.473 回答
1

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

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

于 2008-09-24T21:54:01.253 回答
1

空对象

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

高品质

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

可以在此处找到有关字段策略和 Null 对象的进一步讨论。

表现

关于John Chapman 博客上的字段与属性的性能 看起来中小型结果集的性能没有太大问题。

总而言之,每种方法都有某些可能有用的特权,具体取决于场景(字段访问允许只读 getter,不需要 setter,当您的 poco 不需要任何特殊内容并且似乎是事实上的方法时,属性访问有效。等等)

于 2008-12-17T06:49:23.543 回答
0

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

public class AuditableEntity
{
   /*...*/
   DateTime creationDate = DateTime.Now;
   /*...*/
   public DateTime CreationDate { get { return creationDate; } }
}
于 2008-10-17T16:36:35.363 回答
0

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

于 2009-09-03T20:13:48.547 回答