柚子Nan--回归原点

Everything can be as easy as you like or as complex as you need.
posts - 234, comments - 1011, trackbacks - 17, articles - 36
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

NHibernate 使用手迹(2nd)

Posted on 2005-05-26 16:41  柚子Nan  阅读(...)  评论(...编辑  收藏

[NHibernate怎样配置数据关联]

NHibernate中对于关系的定义有one-to-one, one-to-many, many-to-one, many-to-many四种,为什么要设置one-to-one, one-to-many, many-to-one, many-to-many呢?在做如下例子的时候我一直在思考,做到一半的时候醒悟了,呵呵,原来就是在Load某个对象的时候,也一并加载其对应关系的对象。就是说你获得了Customer对象以后,Customer.CustomerBank对象的数据也Load进来(当然,你也可以设置Lazy=true,后话)

具体到上述4个关系如何配置,我仅说明一个最简单的,并发现一些常犯的错误!

NHibernate中的一对一关联由“one-to-one”节点定义。也很容易理解,就是一个一对一的关系,例如,一个客户拥有一个而且只能拥有一个银行账户。

 

那么Customer.hbm.xml可以如下定义(当然还有其他的配置方法):

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
    
<class name="Data.Customer, Data" table="customer" >
        
<id name="CustomerID" type="Int32" unsaved-value="0">
           
<generator class="identity"/>
       
</id>
        
<property name="CustomerName" column="CustomerName" type="String" length="50"/>
        
<property name="Position" column="position" type="String"/>
        
<one-to-one name="CustomerBank" class="Data.Bank,Data" outer-join="true"/>
    
</class>
</hibernate-mapping>

 

Bank.hbm.xml可以定义如下:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
    
<class name="Data.Bank, Data" table="bank" >
        
<id name="CustomerID" type="Int32" unsaved-value="0">
           
<generator class="identity"/>
       
</id>
        
<property name="BankName" column="CustomerName" type="String" length="50"/>
        
<property name="BankBalance" column="position" type="Decimal"/>
    
</class>
</hibernate-mapping>

 

[特别注意]

1 所有的hbm.xml的属性必须设置为Embedded Resource.否则会有异常抛出!

2 注意<one-to-one name="CustomerBank" 这里的CustomerBank,为什么是这个名字,有什么来源吗?答案是显然的,这个名字必须与你在Customer.cs文件中定义的对于访问PropertyBank的名字一致!也就是说,代码必须为:

       public Bank CustomerBank
       
{
           
get{return aBank;}

           
set{aBank = value;}
       }