代码之家  ›  专栏  ›  技术社区  ›  mathieu

nhibernate:映射到字段或属性?

  •  12
  • mathieu  · 技术社区  · 16 年前

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

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

    映射到字段是“坏”的吗?是否有最佳实践?

    7 回复  |  直到 15 年前
        1
  •  5
  •   Gilligan    16 年前

    我映射到属性。如果我发现有必要,我会把setter映射到一个字段。(通常通过类似“access=field.camelcase”的方式)。

    这让我有了好看的查询,例如“来自firstname='john'的人”,而不是像“来自firstname/'u firstname的人”,并且在补充我的实体时避免设置逻辑。

        2
  •  2
  •   Jon Adams    16 年前

    当数据进出持久性存储时,如果需要对其进行一些奇怪的操作,属性也很有用。这通常应该避免,但一些罕见的业务案例或遗留支持有时需要这样做。

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

        3
  •  1
  •   Sara Chipps    16 年前

    我映射到属性,我还没有遇到将映射到字段的情况…当我有需要的时候,我会增加我的B.O.设计。我认为它允许更好的建筑。

        4
  •  1
  •   Matt Hinze    16 年前

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

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

        5
  •  1
  •   Jafin    16 年前

    空对象

    如果要实现 null object pattern 如果你上课。因为在映射到属性时无法执行(很容易)。最终不得不在数据库中存储假对象。

    HQL

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

    可以进一步讨论字段策略和空对象 here .

    性能

    关于上的字段与属性的性能 John Chapman's blog 对于小型中端结果集,性能似乎没有太大问题。

    总之,根据场景的不同,每种方法都有一定的好处(字段访问允许只读获取程序,不需要设置程序,当POCO不需要任何特殊的属性访问时,属性访问可以工作,并且似乎是defacto方法。等)

        6
  •  0
  •   kÍ©eÍ£mÍ®pÍ¥ Í© Sitam Jana    16 年前

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

    public class AuditableEntity
    {
       /*...*/
       DateTime creationDate = DateTime.Now;
       /*...*/
       public DateTime CreationDate { get { return creationDate; } }
    }
    
        7
  •  0
  •   quip    15 年前

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