nhibernate 内の 1 対 1 の関係は、「false」または「proxy」のいずれかで遅延ロードできます。怠惰な1対1のマッピングを行う方法を誰かが知っているかどうか疑問に思っていました.
プライベート フィールドにマップされた遅延セットを使用し、パブリック プロパティがそのセットの最初の結果を返すようにすることで、同じ結果を達成するためのハックを考え出しました。動作しますが、最もクリーンなコードではありません...
前もって感謝します!
nhibernate 内の 1 対 1 の関係は、「false」または「proxy」のいずれかで遅延ロードできます。怠惰な1対1のマッピングを行う方法を誰かが知っているかどうか疑問に思っていました.
プライベート フィールドにマップされた遅延セットを使用し、パブリック プロパティがそのセットの最初の結果を返すようにすることで、同じ結果を達成するためのハックを考え出しました。動作しますが、最もクリーンなコードではありません...
前もって感謝します!
関連付けが必須でない限り、1 対 1 の遅延読み込みはサポートされていません。理屈はこちらをご覧ください。
つまり、関係の反対側が存在するかどうかを判断するために (N) Hibernate はデータベースにアクセスする必要があるという事実に要約されます。すでにデータベース ヒットを取得しているため、オブジェクト全体をロードすることもできます。
オブジェクトを実際にロードせずに関連オブジェクトが存在するかどうかを確認するためだけに DB をヒットすることが理にかなっている場合もありますが (関連オブジェクトが非常に「重い」場合)、現在 NHibernate ではサポートされていません。
私の知る限り、1 対 1 を遅延ロードするハックでない方法はありません。私が間違っていることを願っていますが、前回確認したときはそうでした。
考え方があります。ここで詳細に説明されています:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateTest" namespace="NHibernateTest">
<class name="Person" >
<id name="PersonID" type="Int32">
<generator class="identity" />
</id>
<property name="LastName" type="String" length="50" />
<property name="FirstName" type="String" length="50" />
<many-to-one name="Photo" class="PersonPhoto" />
</class>
<class name="PersonPhoto">
<id name="PersonID" type="Int32">
<generator class="foreign">
<param name="property">Owner</param>
</generator>
</id>
<property name="Photo" type="BinaryBlob" />
<one-to-one name="Owner" class="Person" constrained="true" />
</class>
</hibernate-mapping>
上記の Artem Tikhomirov が使用した例を試しました。写真列が存在しないというエラーが表示され続けました。これを見た後、マッピングが少しずれていることがわかりました。多対1のマッピングを変更して、次のように列名を指定すると:
多対一の name="写真" column="PersonID" class="PersonPhoto" unique="true"
私はそれを働かせました。これが誰かに役立つことを願っています:o)