NHibernate初探!

关注NHibernate已N久了,由于各种原因一直处于理论状态,得些时间于是实践一把!
去年下的0.8版感觉有些老了,于是从SF上down下最新版本NHibernate-1.2.0.Alpha1-debug,呵,好久不见又多出好多新东东...

一,从例QuickStar例子说起
down下NH1.2后,竟然不能编译,查之,竟然少了SettingsFactory.cs及SqlLoader.cs两个文件,算了,还是下个DEMO看一下吧,于是就下了

DDLLY兄的QuickStar例子,但还是run不了,哦,user.hbm.xml,hibernate.cfg.xml未设为嵌入资源,go on,成功......
还算顺利,不过看到有configuration有几种配置(http://www.i170.com/article/22290),于是试一把
//Configuration cfg = new Configuration().Configure();
Configuration cfg = new Configuration();
把上面使用hibernate.cfg.xml资源文件的注释,改为下面使用app.config文件的,加入app.config文件
run,succeed!

二,DIY个DEMO
New控制台Project,引用nunit.framework,NHibernate(Ver1.2.0.Alpha1),实体类,Map文件,hibernate.cfg.xml文件
记得数据库用户名,密码
完成TestFixture测试类,build成功,Debugger调试

session.Save(newUser);出错了,错误信息为:Unknown entity class: NHibernateTest.User
或Configuration cfg = new Configuration().Configure();处出错,信息为:Type 'NHibernateTest.User' cannot be specified as proxy
why?调了半天还是没有一点头绪,竟然不认识实体类,Quickstar中不是很正常吗?
没办法,只有求助csdn(http://community.csdn.net/Expert/topic/4883/4883788.xml?temp=.3518946),有仁兄给出答案
为每实体类属性加上virtual关键字,这招还非常强,实体信息正常的插入至数据库...

虽然我的问题似乎得了解决,但我对这种解决方案存在疑惑,为什么QuickStar例子什么也没加,也可以正常呢?
于是决定看NH的源码,但我DOWN的源码不能编译,因为少文件啊,刚才那位仁兄在贴子中回复少的这两个文件可以删除?
但我用ILDASM.EXE看一下我引用的NHibernate.dll,得到的结果是SettingsFactory类是有存在的,是否此类必须存在,这个问题我决定查看一
下其它的版本,在0.8版本中我看到此类是必须需要的,它是BuildSessionFactory时用到的。
用ILDAMS查看Nhibernate.dll的0.8版本及1.2版本,我发现对于SettingsFactory类的实现基本是一样,虽然现在NH1.2版本没有,但能否考虑
把0.8版本中的两个文件加入到1.2版本中呢?于是我试一下,结论是我的想法是错误的!其中有些变量在NH1.2版本中都没有实现,如:

hibernate.use_outer_join(允许使用外连接抓取。) 在NH1.2版本中都找不到定义实现,所以说,NH1.2版本应该有很大改动(没看官方文章惹的

祸啊),NH1.2改动这么大,其它版本的呢?于是我又DOWN了NH1.0.1,查看之,没错,是存在的。

上面把NH0.8中的文件复制到NH1.2中去用荒谬的想法,虽然结论是失败的,但通过对NH源码的查看,我意识到Unknown entity class这个异常很

可能就是由于版本问题产生的,我程序中用的版本是NH1.2,新版本应该或多或少都会存在些不足的地方,虽然在实体类的属性加上Virtual可以解

决问题,但我更加相信这是缺陷...

最后我引用NH1.0.1的NHibernate.dll到我的测试项目,一切OK,也不用加Virtual了,都是偶DOWN的新版本若的祸,呵呵,被NHibernate晃点两天

的问题终于可以结束了!

三,附上一些测试文件
//User.cs

ContractedBlock.gif ExpandedBlockStart.gif User实体类
None.gif
None.gif
using System;
None.gif
None.gif
namespace NHibernateTest
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif [Serializable]
InBlock.gif 
public class User
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif  
public User()
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
ExpandedSubBlockEnd.gif  }

InBlock.gif  
private int m_Id;
InBlock.gif  
private string m_UserName;
InBlock.gif  
private string m_Password;
InBlock.gif  
private string m_Email;
InBlock.gif
InBlock.gif  
public int Id 
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif   
get dot.gifreturn m_Id; }
ExpandedSubBlockStart.gifContractedSubBlock.gif   
set dot.gif{ m_Id = value; }
ExpandedSubBlockEnd.gif  }

InBlock.gif
InBlock.gif  
public string UserName 
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif   
get dot.gifreturn m_UserName; }
ExpandedSubBlockStart.gifContractedSubBlock.gif   
set dot.gif{ m_UserName = value; }
ExpandedSubBlockEnd.gif  }

InBlock.gif
InBlock.gif  
public string Password 
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif   
get dot.gifreturn m_Password; }
ExpandedSubBlockStart.gifContractedSubBlock.gif   
set dot.gif{ m_Password = value; }
ExpandedSubBlockEnd.gif  }

InBlock.gif
InBlock.gif  
public string Email 
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif   
get dot.gifreturn m_Email; }
ExpandedSubBlockStart.gifContractedSubBlock.gif   
set dot.gif{ m_Email = value; }
ExpandedSubBlockEnd.gif  }

ExpandedSubBlockEnd.gif }

ExpandedBlockEnd.gif}

//User.hbm.xml

ContractedBlock.gif ExpandedBlockStart.gif User.hbm.xml
None.gif
None.gif
<?xml version="1.0" encoding="utf-8" ?> 
None.gif
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
None.gif    
<class name="NHibernateTest.User, NHibernateTest" table="users">
None.gif  
<id name="Id" column="id" type="Int32"> 
None.gif   
<generator class="identity" />
None.gif  
</id>
None.gif  
None.gif  
<property name="UserName" column="UserName" type="String"/>
None.gif  
<property name="Password" column="Password" type="String"/>
None.gif  
<property name="Email" column="Email" type="String"/>
None.gif 
</class> 
None.gif
</hibernate-mapping>
None.gif

//hibernate.cfg.xml

None.gif
None.gif
<? xml version = " 1.0 "  encoding = " utf-8 "   ?>
None.gif
< hibernate - configuration xmlns = " urn:nhibernate-configuration-2.0 " >
None.gif 
< session - factory >
None.gif  
<!--  属性  -->
None.gif  
< property name = " connection.provider " > NHibernate.Connection.DriverConnectionProvider </ property >
None.gif  
< property name = " connection.driver_class " > NHibernate.Driver.SqlClientDriver </ property >
None.gif  
< property name = " connection.connection_string " > server = 127.0 . 0.1 ;database = user;uid = sa;pwd = XX; </ property >
None.gif  
< property name = " show_sql " > false </ property >
None.gif  
< property name = " dialect " > NHibernate.Dialect.MsSql2000Dialect </ property >
None.gif  
< property name = " use_outer_join " > true </ property >
None.gif  
< property name = " query.substitutions " > true   1 false   0 , yes  ' Y ' , no  ' N ' </ property >
None.gif  
<!--  映射文件  -->
None.gif  
< mapping assembly = " NHibernateTest "   />
None.gif 
</ session - factory >
None.gif
</ hibernate - configuration >
None.gif

//NUnit测试类

ContractedBlock.gif ExpandedBlockStart.gif Test
None.gif
None.gif[Test]
None.gif  
public void TestAddUser() 
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif{
InBlock.gif   User newUser 
= new User();
InBlock.gif   
//配置Configuration
InBlock.gif
   Configuration cfg = new Configuration().Configure();
InBlock.gif   
//Configuration cfg = new Configuration();
InBlock.gif   
//cfg.AddAssembly("NHibernateTest");
InBlock.gif   
//创建ISessionFactory
InBlock.gif
   ISessionFactory factory = cfg.BuildSessionFactory();
InBlock.gif   
//定义事务
InBlock.gif
   ITransaction tx = null;
InBlock.gif   
//打开ISession
InBlock.gif
   ISession session = factory.OpenSession();
InBlock.gif   
InBlock.gif   
try   
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    
//开始事务
InBlock.gif
    tx = session.BeginTransaction();
InBlock.gif    newUser.UserName 
= "aa";
InBlock.gif    newUser.Password 
= "123456";
InBlock.gif    newUser.Email 
= "123@sohu.com";
InBlock.gif    
// 保存新用户
InBlock.gif
    session.Save(newUser);
InBlock.gif    tx.Commit();
ExpandedSubBlockEnd.gif   }

InBlock.gif   
catch(HibernateException ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    
if (tx!=null) tx.Rollback();    
InBlock.gif    
throw ex;
ExpandedSubBlockEnd.gif   }

InBlock.gif   
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    
//关闭ISession
InBlock.gif
    session.Close();
ExpandedSubBlockEnd.gif   }

InBlock.gif
ExpandedBlockEnd.gif  }

None.gif

转载于:https://www.cnblogs.com/linfuguo/archive/2006/07/17/453227.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值