柚子Nan--回归原点

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

NHibernate 使用手迹(2nd)

Posted on 2005-05-26 16:41 柚子Nan 阅读(1896) 评论(9)  编辑 收藏 网摘 所属分类: [技术.Net]

[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;}
       }

 

Feedback

#1楼    回复  引用  查看    

2005-05-26 16:57 by idior      
haha 你总算说到点子上了.

关联是orm中一个非常复杂,也是非常需要解决的问题。
这也是data mapper和table gateway ,row gateway很大不同的地方。

-----
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呢?在做如下例子的时候我一直在思考
-----
看来你对此了解的很少, 这样的话学习使用nh恐怕早了点 :)

#2楼 [楼主]   回复  引用  查看    

2005-05-26 17:06 by 柚子Nan      
呵呵,这么多年了开发软件都是table gateway ,row gateway的思维方式,正在试图改变,并且慢慢的实践!
关联配置确实非常复杂,自从开始试用这个东西,发现对于数据的CRUD是否成功很大程度上依赖于对于ORM配置的熟练程度和理解深度。

#3楼 [楼主]   回复  引用  查看    

2005-05-26 17:08 by 柚子Nan      
one-to-one, one-to-many, many-to-one, many-to-many这些关系我理解,不过只是理论上的理解,软件开发的很多东西需要Practise, 其实这4个关系的正确使用就正好是一个不错的切入点!

#4楼    回复  引用  查看    

2005-05-26 20:33 by 听棠.NET      
如果要对这个对象进行删除,那么这关系上的bank记录会不会被删除呢?
楼主把其他关系也写出来吧。让我好知道这些东西到底有哪些实用的价值。

#5楼    回复  引用    

2005-05-26 20:39 by idior [未注册用户]
@听棠.NET
如果选择级连删除会的.
关联是o/r m的不同于table gateway ,row gateway的关键之处.
也是用起来实现起来比较复杂的地方. 不过只有这样o/r m才能达到某种程度上的transparent

#6楼    回复  引用  查看    

2005-05-27 17:25 by 听棠.NET      
@idior :
级连删除是如何选择的?是针对一个关系,还是针对主对象,如果是针对主对象的话,主对象有五个"relation",可我不想全部删除怎么呢?
还有那个lazy是针对"relation"还是针对主对象的。
我从来不否认"relation"在ORM中的不可忽略性,只是我想知道,具体那些"relation"有哪些可用这处而已,我想大家不会只为了“概念”而去搞个几乎或者根本不现实的东西吧?
我觉得举几个典型的例子比较好,这可以让我们在示例中联想到其他的使用可能性,现在连个实际的示例都没有,象我就是想不出来啊。

#7楼 [楼主]   回复  引用  查看    

2005-05-28 11:27 by 柚子Nan      
@听棠.NET :
级连删除或者级连更新好像不是你说的那么回事?对象和关系并不矛盾!
按照你说的情况,有五个关系,那么你要在hbm.xml文件中针对这个对象配置5个关系,那么每个关系都可以设置cascade="none" 还是cascade="all | Update| delete" 等等。

#8楼 [楼主]   回复  引用  查看    

2005-05-28 11:30 by 柚子Nan      
不过我有个疑惑,这里配置的级连删除或者级连更新与SQL Server中对关系的级连删除或者级连更新有什么关系,是否在hbm.xml中配置了,数据库即使配置配置了也是一种被覆盖的关系。
就像我们程序中使用的Web.Config和Machine.Config?

#9楼    回复  引用  查看    

2005-06-04 22:13 by kwklover      
级连删除是数据库实现完整性的一种约束条件,NH是不应该插手数据库级的完整性约束的事情的

无论是采用传统的table还是所谓的NH设计程序,数据库和应用程序都是相对独立的单元,NH只不过充当了两着之间的中间层,负责两着之间的交互和通讯,并使这种交互方式更OO而已,除此之外,NH并不需要做太多的工作吧 ?

个人理解




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-05-26 17:16 编辑过
Google站内搜索

相关文章:

相关链接: