ASP.NET MVC4 中整合 NHibernate3.3、Spring.NET2.0、ExtJS4 笔记三:NHibernate配置

目前NHibernate的最新版是3.3.2,官方下载地址:http://sourceforge.net/projects/nhibernate/files/NHibernate/

下载后解压NHibernate.dll、Iesi.Collections.dll放到固定目录(可以在解决方案下新建个Lib目录,放进去),另外如果使用Mysql数据库,还要找个版本合适的Mysql.data.dll文件。

现在,我们仅是为了配置NHibernate环境,并且测试是否成功,所以我们直接在Web项目中添加这三个dll的引用,,并直接在控制器中编写数据访问代码。


一、编写实体类

在Model项目中创建实体类:User,内容如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LMJ.Model
{
    public class User
    {
        public String Code { get; set; }
        public String Name { get; set; }
        public int Age { get; set; }
    }
}

实体类中的属性及其类型与数据表相对应,具体如何映射由配置文件设置。


二、编写实体映射文件

在Model项目中创建目录:Mapping,并在里面创建User.hbm.xml文件,内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="LMJ.Model" assembly="LMJ.Model">
	<class name="User" table="`user`" lazy="false">
		<id name="Code" column="Code" type="String">
			<generator class="assigned" />
		</id>
		<property name="Name" column="Name" type="String" length="50" />
		<property name="Age" column="Age" type="int" />
	</class>
</hibernate-mapping>

在使用Hibernate框架时,每张表都有一个实体类与之对应,并有一个配置 (映射)文件设置表与实体类之间是如何映射的。

比如这里:

1、namespace配置实体类所在的命名空间,assembly配置实体类文件名(也就是Model项目生成的dll文件名);

2、class节点中的 name 属性映射实体类的名称;table 映射数据表的名称,名称两边的“·”(Tab键上面的字符)处理特殊的表名,相当于MS SQL中的“[User]”(NHibernate会自动根据数据库类型进行处理);lazy配置是否延迟加载。

3、class中的id配置数据表主键,name是实体类的属性名称,column是数据表中的列名,type就是字段类型了;generator定义主键类型,这个类型比较多,具体有如下几个(网上摘抄):

1) increment 
increment: 对 long , short 或 int 的数据列生成自动增长主键。 
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实 
例访问,此方式必须避免使用。
2) identity 
对如 SQL server , MySQL 等支持自动增长列的数据库,如果数据列的类型是 long, short 或 int ,可使用主键生成器生成自动增长主键。
3) seqhilo 
对如 Oracle , DB2 等支持 Sequence 的数据库,如果数据列的类型是 long,short 或 int ,可使用该主键生成器生成自动增长主键。 对 Sequence 解释可以参见 http://easyworld.javaeye.com/blog/214098 
4)uuid: 
对字符串列的数据采用 128-位 uuid 算法生成唯一的字符串主键。
5) hilo 
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。
6) foreign 
使用外部表的字段作为主键。
7) native 
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式,这种方式我在开法过程中经常用到,意思是把主键的生成方式交给底层数据库来决定。
8) assigned 
主键由外部程序负责生成,无需Hibernate参与。
9) uuid.hex 
由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
10) uuid.string 
与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。
一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。

4、property节点定义数据表中的每一个字段是如何与实体类中的属性映射的,这里不啰嗦了,可以搜索一下。


三、编写控制器及Action

在Manage区域中添加控制器:UserController,内容如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Collections;
using NHibernate;
using NHibernate.Cfg;

namespace LMJ.Web.Areas.Manage.Controllers
{
    public class UserController : Controller
    {
        public ActionResult Index()
        {
            int i = 0;
            ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();
            ISession session = sessionFactory.OpenSession();
            if (session != null)
            {
                IList results = session.CreateQuery("from User").List();
                i = results.Count;

                session.Close();
            }
            ViewData["message"] = "数据集总数:" + i;
            return View();
        }
    }
}

四、创建视图文件

Web项目中的“\Areas\Manage\Views\User”目录中添加Index.cshtml,内容如下:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        @ViewData["message"]
    </div>
</body>
</html>

五、创建Hibernate配置文件

在Web项目根目录中创建hibernate.cfg.xml(NHibernate会自动搜索),内容如下:

mysql配置:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
	<session-factory>
		<!-- properties -->
		<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
		<property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
		<property name="connection.connection_string">Database=lmj;Data Source=localhost;User Id=root;Password=root</property>
		<property name="dialect">NHibernate.Dialect.MySQL5Dialect</property>
		<property name="show_sql">true </property>
		<property name="hbm2ddl.keywords">none</property>
		<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
		
		<mapping assembly="LMJ.Model"/>
	</session-factory>
</hibernate-configuration>

如果使用的是SQL SERVER 2008,是这样的:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
	<session-factory>
		<!-- properties -->
		<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
		<property name="connection.driver_class">NHibernate.Driver.Sql2008ClientDriver</property>
		<property name="connection.connection_string">Database=lmj;Data Source=localhost;User Id=sa;Password=root</property>
		<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
		<property name="show_sql">true </property>
		<property name="hbm2ddl.keywords">none</property>
		<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
		
		<mapping assembly="LMJ.Model"/>
	</session-factory>
</hibernate-configuration>

hibernate.cfg.xml主要是配置数据库信息,以及实体类的位置,这里的mapping节点就是配置实体类在LMJ.Model程序集中,Hibernate会自动搜索这些实体类。


六、测试访问

根据项目实际情况,进行测试访问,最后会输出User表中的数据集总数。


下一篇开始配置Spring.NET环境。


你可能感兴趣的:(mvc,mvc,ExtJs,ExtJs,ExtJs,ExtJs,ExtJs,spring.net,NHibernate,NHibernate,NHibernate)