2009-04-17 11 views
0

今週はNHibernateを使い始めました(苦労しています)。私は3つのテーブルを持つ小さなアプリケーションを持っています(私は現在2つ使用しています)。テーブルcurrencyとテーブルcountryは、マッピングファイルです。NHibernate 2.0.1で子テーブルに挿入

<class name="dataprovider.Country,dataprovider" table="country"> 
    <id name="CountryId" column="country_id" unsaved-value="0"> 
     <generator class="native"/> 
    </id> 
    <!--<bag name="BatchList" inverse="true" lazy="true" > 
     <key column="country_id" /> 
     <one-to-many class="Batch" /> 
    </bag> 
    <bag name="PrinterList" inverse="true" lazy="true" > 
     <key column="country_id" /> 
     <one-to-many class="Printer" /> 
    </bag>--> 
    <many-to-one name="CurrencyId" column="currency_id" class="Currency" cascade="save-update"/> 
    <!--<property column="currency_id" name="Currency_Id"/>--> 
    <property column="name" name="Name"/> 
    <property column="region" name="Region" /> 
    <property column="comments" name="Comments"/> 
</class> 

通貨マッピングファイル:

<class name="dataprovider.Currency, dataprovider" table="currency"> 
    <id name="CurrencyId" column="currency_id" > 
     <generator class="native"/> 
    </id> 
    <bag name="CountryList" inverse="true" lazy="true" > 
     <key column="currency_id" /> 
     <one-to-many class="Country" /> 
    </bag> 
    <!--<bag name="DenominationList" inverse="true" lazy="true" > 
     <key column="currency_id" /> 
     <one-to-many class="Denomination" /> 
    </bag>--> 
    <property column="name" name="Name"/> 
    <property column="authorizer" name="Authorizer" /> 
    <property column="date_created" name="DateCreated" type="DateTime" not-null="true" /> 
    <property column="comments" name="Comments" /> 

countrycountry永続クラスのタイプCurrencyの属性を作成保持することを1人の関係に多くの。私のテストcan_add_currencycan_add_countryが成功しました(私はスキーマをエクスポートしました)、フィールドcurrency_idcountryテーブルにNULL値があります。ここで

は、テストコードです:

[Test] 
    public void can_add_new_country() 
    { 
     CountryManager cm = new CountryManager(); 

     Country country = new Country(); 
     //country.CurrencyId = CurrencyManager.GetCurrencyById(1); 
     country.CurrencyId = new CurrencyManager().GetCurrencyById(1); 
     country.Name = "POUND"; 
     country.Region = "ENGLAND"; 
     country.Comments = "the comment"; 

     cm.Add(country); 

     using(ISession session = _sessionFactory.OpenSession()) 
     { 
      Country fromdb = session.Get<Country>(country.CountryId); 
      Assert.IsNotNull(fromdb); 
      Assert.AreNotSame(fromdb, country); 
     } 
    } 

    public Currency GetCurrencyById(int currency_id) 
    {//GetCurrencyById from CurrencyManger class 
     try 
     { 
      using(ISession session = NHibernateHelper.OpenSession()) 
      { 
       return session.Get<Currency>(currency_id); 

      } 
     } catch (Exception ex) 
     { 
      return null; 
     } 
    } 

質問です:テーブル通貨から既存currency_idのcurrency_idとテーブル国に挿入する方法?

あなたはどのようにしていますか?私は真剣に立ち往生しています.2日間の小規模なプロジェクトで今一週間服用しています。

答えて

0

bag name="CountryList"cascade="save-update"を設定してください。それでも問題が解決しない場合は、保存方法を確認するためにCountryManager.Add()のコードを投稿すると便利です。あなたはとてもオブジェクトがない負荷のすべての要素意志ロード、怠惰としてコレクションをマッピングし

:私はそれを正しく理解すれば、あなたの2番目の質問に応えて

が、これはどのようにNHibernateはコレクションをマッピングされた扱いであります同時に収集します。代わりに、あなたが最初にコレクションにアクセスするとき、NHibernateはコレクションを満たすためにデータベースにクエリを返し、それを返します。だから、あなたが最初のような何かをするとき:

NHibernateのは静かに類似したクエリを実行します
var countries = currency.CountryList; 

または

foreach (Country country in currency.CountryList) 

SELECT * FROM country WHERE currency_id = ? 

をし、Returnに国オブジェクトのコレクションを構築(およびクエリが再度実行されないようにキャッシュする)。

基本的には、NHibernateにあなたの2つのエンティティ(国と通貨)とそれらがどのように関連しているかをNHibernateにすでに伝えているので、データにアクセスするためのクエリを構築する方法を知っています。同様に、コレクション内の内容を追跡するので、項目の追加または削除時に、変更された内容を比較して適切なINSERTまたはREMOVE文を実行できます。

NHibernateでマッピングされたコレクションを使用する方法は、通常の.NETコレクションと同じように使用することです。意志でアイテムを追加したり削除したりします。ちょうどあなたが完了したら、追加/削除するか(カスケードを設定しているかのように)すべての項目に対してsession.Save()またはsession.Delete()を呼び出すか、単純なコールsession.Save()をオンにして、データベースに加えた変更を保持するようにNHibernateに指示してくださいコレクションを含む親オブジェクト

0

私のカスケードは、この側にかなりだった:

<many-to-one name="CurrencyId" column="currency_id" class="Currency" cascade="save-update"/> 

私はそれは私が解決策を再構築していても、最初は働いていなかった、それを変更した後。次に、私はCurrency_Testクラスから別のテストを行いました:can_get_currency_by_id同じ関数GetCurrncyByIdを呼び出し、オブジェクトを持つことができましたが、can_add_new_countryから同じ関数がnullを返します。

Country_Test [Setup]またはCurrency_TestのExportSchemaが、can_add_new_productに通貨オブジェクトを持つためにデータベースを作成していないことに気付きました。それがnullオブジェクトを返す理由です。

今や悪用しないでください。 IList<Counrty>CountryListの使い方を教えてください。私はそれをよく置くか分からない。私の理解から、currency(currency_id参照)を使用しているすべてのcountryオブジェクトを格納する必要があります。 NHibernateはどうしますか?

+0

私は自分の答えを更新しました。うまくいけば、あなたが求めている質問に答えます。 –

+0

私はそれを読んでくれてありがとう。ちょっとはっきりしています。私は、Jbossが冬眠を買ったように見えるので、何が起きるのだろうかと思っています。 –

関連する問題