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>

もちろん、理由を説明してください:)

通常はプロパティにマップしますが、フィールドにマップすると、プロパティのゲッター/セッターに「ロジック」を入れることができます。

フィールドにマップするのは「悪い」ですか? ベストプラクティスはありますか?

4

7 に答える 7

5

プロパティにマッピングします。必要に応じて、SETTER をフィールドにマップします。(通常は "access=field.camelcase" などを介して)。

これにより、「from People Where firstName/_firstName」のようなものではなく、「from People Where FirstName = 'John'」などの見栄えの良いクエリを作成でき、エンティティをハイドレートする際のセッター ロジックも回避できます。

于 2008-09-24T20:36:20.987 に答える
2

プロパティは、データが永続的なストレージに出入りするときに、データに対して何か変わったことをする必要がある場合にも役立ちます。通常、これは避けるべきですが、まれなビジネス ケースやレガシー サポートでは、これが必要になることがあります。

(データが getter で返されたときにデータを何らかの方法で変換すると、NHibernate は (デフォルトで) getter からの戻り値を使用し、セッションがフラッシュ/クローズされたときにその方法でデータベースに保存することを覚えておいてください。必ず確認してください。それがあなたの望みです。)

于 2008-09-26T03:26:43.270 に答える
1

ヌル オブジェクト

フィールドへのマッピングは、クラスでnull オブジェクト パターンを実装している場合に役立ちます。これは、プロパティへのマッピング時に (簡単に) 実行できないためです。最終的には、偽のオブジェクトをデータベースに保存する必要があります。

HQL

フィールド アクセス アプローチを使用している場合、HQL クエリでプロパティ名を変更する必要があるかどうかはわかりませんでした。つまり、プロパティ名を引き続き使用するため、<property name="FirstName" access="field.camelcase" /> まだ書くことができると思っていた場合。"From Person where FirstName = :name";

フィールド戦略と Null オブジェクトの詳細については、こちらを参照してください。

パフォーマンス

John Chapman のブログのフィールドとプロパティの パフォーマンスに関して、中小規模の結果セットのパフォーマンスにはあまり問題がないようです。

要約すると、各アプローチには、シナリオに応じて役立つ特定の特典があります (フィールド アクセスでは読み取り専用の getter が許可され、setter は必要ありません。プロパティ アクセスは、poco から特別なものを必要とせず、デファクト アプローチと思われる場合に機能します。など)

于 2008-12-17T06:49:23.543 に答える
1

自動プロパティを使用するため、プロパティにマップします。

コレクション( s など)を除きsetます。フィールドにマップするもの(access="field.camelcase-underscore")は、それらを公開するパブリック プロパティではなく、メソッドを持っているためです。

于 2008-09-24T21:54:01.253 に答える
1

私はプロパティにマップしますが、フィールドにマップする状況に遭遇したことはありません...そして、必要に応じてBOデザインを拡張します。より良いアーキテクチャが可能になると思います。

于 2008-09-24T20:35:01.473 に答える
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 に答える