关注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
User实体类
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
using System;
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
namespace NHibernateTest
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
{
[Serializable]
public class User
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
public User()
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
}
private int m_Id;
private string m_UserName;
private string m_Password;
private string m_Email;
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
public int Id
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
get
{ return m_Id; }
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
set
{ m_Id = value; }
}
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
public string UserName
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
get
{ return m_UserName; }
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
set
{ m_UserName = value; }
}
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
public string Password
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
get
{ return m_Password; }
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
set
{ m_Password = value; }
}
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
public string Email
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
get
{ return m_Email; }
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
set
{ m_Email = value; }
}
}
}
//User.hbm.xml
User.hbm.xml
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="NHibernateTest.User, NHibernateTest" table="users">
<id name="Id" column="id" type="Int32">
<generator class="identity" />
</id>
<property name="UserName" column="UserName" type="String"/>
<property name="Password" column="Password" type="String"/>
<property name="Email" column="Email" type="String"/>
</class>
</hibernate-mapping>
//hibernate.cfg.xml
<?
xml version
=
"
1.0
"
encoding
=
"
utf-8
"
?>
<
hibernate
-
configuration xmlns
=
"
urn:nhibernate-configuration-2.0
"
>
<
session
-
factory
>
<!--
属性
-->
<
property name
=
"
connection.provider
"
>
NHibernate.Connection.DriverConnectionProvider
</
property
>
<
property name
=
"
connection.driver_class
"
>
NHibernate.Driver.SqlClientDriver
</
property
>
<
property name
=
"
connection.connection_string
"
>
server
=
127.0
.
0.1
;database
=
user;uid
=
sa;pwd
=
XX;
</
property
>
<
property name
=
"
show_sql
"
>
false
</
property
>
<
property name
=
"
dialect
"
>
NHibernate.Dialect.MsSql2000Dialect
</
property
>
<
property name
=
"
use_outer_join
"
>
true
</
property
>
<
property name
=
"
query.substitutions
"
>
true
1
,
false
0
, yes
'
Y
'
, no
'
N
'
</
property
>
<!--
映射文件
-->
<
mapping assembly
=
"
NHibernateTest
"
/>
</
session
-
factory
>
</
hibernate
-
configuration
>
//NUnit测试类
Test
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
[Test]
public void TestAddUser()
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
{
User newUser = new User();
//配置Configuration
Configuration cfg = new Configuration().Configure();
//Configuration cfg = new Configuration();
//cfg.AddAssembly("NHibernateTest");
//创建ISessionFactory
ISessionFactory factory = cfg.BuildSessionFactory();
//定义事务
ITransaction tx = null;
//打开ISession
ISession session = factory.OpenSession();
try
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
//开始事务
tx = session.BeginTransaction();
newUser.UserName = "aa";
newUser.Password = "123456";
newUser.Email = "123@sohu.com";
// 保存新用户
session.Save(newUser);
tx.Commit();
}
catch(HibernateException ex)
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
if (tx!=null) tx.Rollback();
throw ex;
}
finally
![](https://i-blog.csdnimg.cn/blog_migrate/3112b7b6526db5bc83e275260ae60525.gif)
{
//关闭ISession
session.Close();
}
![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
}