Nhibernateの関連マッピングの作成と取得
-
10-10-2019 - |
質問
2つの永続的なクラスがあるとします Cat
と Hat
. 。猫の場合、2つの関係は双方向に1対多いものであると想像してみましょう。各クラスのインスタンス間に関連性を作成するために、私はできるはずです、そして私が間違っている場合は私を修正する必要があります。
Cat whiskers = new Cat();
Hat redHat = new Hat();
redHat.Id = 1; // normally assigned by generator but this makes example more explicit
whiskers.Hats.Add(redHat);
catService.Save(whiskers);
hatService.Save(redHat);
それを念頭に置いて、次のことをすることでレッドハットに関連する猫を取り戻すことができないはずですか?
Hat hat = hatService.FindById(1); // redHat has Id 1
Cat cat = hat.Cat; // cat should be whiskers
残念ながら、この手法を使用しようとすると、CATはその最後の行のヌルオブジェクトとして生じます。 cat.hbm.xmlで1対多マッピングに何かが欠けていると思います。これが現在のように見えるものです:
<set name="Hats" inverse="true">
<key column="Id"/>
<one-to-many class="Hat"/>
</set>
hat.hbm.xmlにマッピングはありません。1つを追加しても「重複マッピング」エラーが発生したためです。冬眠を読みました ドキュメンテーション アソシエーションマッピングでは、それでもこれを機能させることはできません。私は何が間違っているのですか?
以下のマッピングファイルを完了します。
cat.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Domain"
namespace="Domain">
<class name="Cat" table="cats" lazy="true">
<id name="Id">
<generator class="increment" />
</id>
<property name="Name" />
<set name="Hats" inverse="true">
<key column="Id"/>
<one-to-many class="Hat"/>
</set>
</class>
</hibernate-mapping>
hat.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Domain"
namespace="Domain">
<class name="Hat" table="hats" lazy="true">
<id name="Id">
<generator class="increment" />
</id>
</class>
</hibernate-mapping>
編集
問題は、私が初期化していなかったことだと思います ISet<Hat>
猫のクラスの価値。しかし、私は新しい問題に遭遇しました。協会にアクセスしようとすると、このエラーが発生します。
Could not initialize proxy - no Session.
このようなセッションでラップできる方法をDAOで作成した場合、これは簡単に回避されると考えました。
public Cat GetRelatedCat(Hat hat)
{
Cat cat;
using (ISession session = HibernateUtil.GetSessionFactory().OpenSession())
{
cat = hat.Cat;
}
return cat;
}
これにより、同じ「セッションなし」エラーが得られます。私は困惑しています。
解決 2
セッションを開き、トランザクションを実行し、セッションシングルトン内のコレクションプロキシにアクセスしてからセッションを閉じることができるセッションマネージャーを作成することで問題を解決しました。
他のヒント
hat.hbmに多くのエントリを追加する必要があります。私は働くべきだと思います。
その後、協会の両側を設定する必要があります
whiskers.hats.add(redhat);
redhat.cat = whiskers;
これにより、サンプルが機能するはずだと思います。
「セッションなし」の問題の理由は、コレクションプロキシが作成されたセッションでのみ機能するためです。したがって、あなたの例では、帽子インスタンスを作成したセッションでのみ動作します。プロキシを別のセッションに接続することは可能ですが、トランザクションの境界とデータの一貫性に複雑な意味を持つため、一般的に推奨されません。