12

識別子なしでビューをマップしようとしていますが、nhibernate は引き続き id 列を含む sql を生成します (ID 列が db に存在しないため、sql エラーが発生します)。多分私は Id() コンストラクターを誤解していますか?

コンストラクターのコメント:

ドメイン オブジェクトまたはデータベース内の列に対応するプロパティを持たない Id を作成します。これは主に、読み取り専用アクセスおよび/またはビューで使用するためのものです。デフォルトは、「インクリメント」ジェネレーターを使用した int ID です。

public class PersonMapping : ClassMap<Person>
{
    public PersonMapping()
    {
        Table("person");
        ReadOnly();

        Id();
        Map(f => f.Name, "name");
    }
}
4

2 に答える 2

8

Hibernate には ID が必要です。メソッド doc は、ドメイン オブジェクトに対応するプロパティを持たない ID を作成すると述べていますが、データベースにはまだ ID があります。

テーブルに識別子としてマークするフィールドがない場合 (一意である必要があります)、複合 ID として構成できるいくつかの列を識別できる可能性があります。

たとえば、ある int を別の int にリンクする単純なリンク テーブルがあるとします。

A | B
-----
1 | 2
1 | 3
2 | 2

すべての A/B の組み合わせが一意である限り、複合 ID を使用できます。

public PersonMapping()
{
    [...]
     CompositeId()
         .KeyProperty(x => x.A)
         .KeyProperty(x => x.B);
    [...]
}
于 2010-08-17T15:23:40.707 に答える
5

エンティティではなく、値オブジェクト (非管理エンティティ) としてレコードを取得できます。

" 14.1.5. 管理されていないエンティティを返す

IResultTransformerをネイティブ SQL クエリに適用することができます。たとえば、管理されていないエンティティを返すことができるようにします。

sess.CreateSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
    .SetResultTransformer(Transformers.AliasToBean(typeof(CatDTO)))

このクエリは次を指定しました。

  • SQL クエリ文字列
  • 結果変換器

上記のクエリは、インスタンス化され、対応するプロパティまたはフィールドにおよびCatDTOの値が挿入されたリストを返します。"NAMEBIRTHNAME

于 2010-11-18T09:53:23.803 に答える