本人在学习J2ee的时候,用了一下在eclipse中使用集成好的hibernate,感觉很方便,配置也很简单,看到nhibernate出来以后,也想试一下,于是建立了这个项目,开始的时候是用的beta版,然后按官方说明中的示例没有一次是成功的,在网上搜集多方资料后,加上自己的思考写出了这个简单的项目,放于网上供大家学习。
本人用的数据库是mysql5.0,在项目中需要添加引用mysql.data
数据库 名称:test
表名:User
字段
Id int 自动增长 为主键
name char(10)
首先建立一个项目,项目名称为nhibernate,然后添加一个新的类库项目,项目名称为 QuickStart,
建立类 User.cs
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace QuickStart ... {
public class User
...{
private Int32 mid;
public Int32 id
...{
get ...{ return mid; }
set ...{ mid = value; }
}
private String mname;
public String name
...{
get ...{ return mname; }
set ...{ mname = value; }
}
}
}
然后,添加映射文件 User.hbm.xml
< hibernate-mapping xmlns:xsd ="http://www.w3.org/2001/XMLSchema" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns ="urn:nhibernate-mapping-2.0" >
< class name ="QuickStart.User,QuickStart" table ="User" >
< id name ="id" column ="Id" type ="Int32" >
< generator class ="identity" />
</ id >
< property name ="name" column ="name" type ="String(10)" not-null ="true" />
</ class >
</ hibernate-mapping >
添加完这个xml文件后,请把生成操作改成嵌入式资源
把NH源文件中包含的nhibernate-mapping-2.0.xsd文件拷贝到%.NET 2003安装目录%/Common7/Packages/schemas/xml文件夹下,可获得intellisense的输入支持。
1) class节点。该节点指示NH对该类的对象进行orm操作的所需的信息。
class节点的部分重要属性含义:
Attributes | Usage | Example |
name | 指示所映射类的全限定名称,格式如namespace.className.assemblyName。Required | BasicMappings.Category, BasicMappings |
table | 指示该类所对应的数据表名称。Required | nh_categories |
schema | 指示所使用的数据库schema,默认继承hibernate-mappings的schema设定。 | NhTrial.dbo |
mutable | 指示该类的对象可变,即nh是否可对此对象进行保存和修改的持久化操作。Optional |
|
其他还有lazy, persister和proxy等可选属性,在后续文章中会有介绍。
2) id节点。id节点设定了该class的主键信息:
Attributes | Usage | Example |
name | 指示对象的主键属性的名称 | ID |
type | 指示该属性的NH数据类型。可选,NH可自动转换。 | Guid |
column | 指示该属性对应的数据字段名称,默认取name属性值。Optional | ID |
unsaved-value | 指示该对象未保存的主键属性的取值,用于ISession.SaveOrUpdate()操作提供根据。Optional |
|
access | 指示NH对该属性所采取的access-strategy和naming-strategy。默认从hibernate-mapping的default-access继承。Optional | field.camelcase |
3)generator节点。该节点指示了主键的生成方式
class | usage |
identity | 支持DB2/MySql/MsSql/Sybase/HypersonicSql,生成整型自增id |
sequence | 支持DB2/PostgreSql/Oracle,生成整型自增id |
guid | 指示使用Guid.NewGuid来生成主键值 |
native | 指示根据数据类型,按照identity、sequence或hilo的方式生成主键 |
assigned | 指示主键值的设定由用户代码完成,NH无需理会 |
4)property节点。该节点指示了NH进行属性映射所需要的信息:
Attributes | Usage | Example |
name | 指示对象的属性名称 | Name |
column | 指示该属性对应的数据列名称,默认取name属性。Optional | Name |
type | 指示该属性的NH数据类型。可选,NH可自动转换 | String |
update | 指示在进行update时是否保存该属性的设置。 | true|false |
insert | 指示在进行save操作时是否保存该属性的设置。 | true | false |
formula | 指示该属性为表达式,将使column设置失效。 | ID + Name |
access | 指示NH对该属性所采取的access-strategy和naming-strategy。默认从hibernate-mapping的default-access继承。Optional | field.camelcase |
解释一下反复出现access设置,access=access-strategy + . + naming-strategy。
access-trategy的取值包括:
1)Property:默认值,NH在进行orm时将使用已定义的getter和setter来进行该属性的读取和设置。
2)field:NH在进行orm时,将使用反射来读取和设置数据成员。
3)nosetter:使用getter来读取属性值,使用反射方式来设置对应的数据成员。
4) ClassName:使用指定的访问类进行属性的访问和设置,ClassName为该访问类的全限定名称。
naming -strategy指示了在映射时,应该对name属性进行格式转换的方式。除非access-strategy为nosetter,naming- strategy为可选设置,当未设置naming-strategy时,将直接使用name属性值进行映射。下面以name=FooBar为例,看看 naming-strategy的转换后的结果:
naming-strategy | example |
未设置 | FooBar |
camelcase | fooBar |
camelcase-underscore | _fooBar |
lowercase | Foobar |
lowercase-underscore | _foobar |
pascalcase-underscore | FooBar |
pascalcase-m-underscore | _FooBar |
|
|
然后在nhibernate中添加App.config
在此说明 如果使用了 Configuration cfg = new Configuration().Configure(); 则App.config失效,必须添加一个hibernate.cfg.xml
< configuration >
< configSections >
< section name ="nhibernate" type ="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
< section name ="log4net" type ="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</ configSections >
< nhibernate >
< add key ="hibernate.show_sql" value ="true" />
< add key ="hibernate.connection.provider" value ="NHibernate.Connection.DriverConnectionProvider" />
<!--
<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" />
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<add key="hibernate.connection.connection_string" value="Server=VAD-FLYSQLEXPRESS;initial catalog=quickstart;User Id=sa;Password=root" />
-->
<!--
<add key="hibernate.dialect" value="NHibernate.Dialect.OracleDialect" />
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.OracleClientDriver" />
<add key="hibernate.connection.connection_string" value="Data Source=ora9i;User ID=scott;Password=tiger;" />
-->
<!--
<add key="hibernate.dialect" value="NHibernate.JetDriver.JetDialect,NHibernate.JetDriver" />
<add key="hibernate.connection.driver_class" value="NHibernate.JetDriver.JetDriver,NHibernate.JetDriver" />
<add key="hibernate.connection.connection_string" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:usinessCMSCMSinDebugcms.mdb;Persist Security Info=True" />
-->
< add key ="hibernate.dialect" value ="NHibernate.Dialect.MySQLDialect" />
< add key ="hibernate.connection.driver_class" value ="NHibernate.Driver.MySqlDataDriver" />
< add key ="hibernate.connection.connection_string" value ="Server=localhost;Database=test;Uid=root;pwd=root;CharSet=gb2312" />
</ nhibernate >
</ configuration >
然后在button中添加点击事件
// Configuration cfg = new Configuration().Configure();
cfg.AddAssembly( " QuickStart " );
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();
User newUser = new User();
// newUser.id = 1;
newUser.name = " abc " ;
// newUser.name = maskedTextBox1.Text;
// Tell NHibernate that this object should be saved
session.Save(newUser);
session.Flush();
// commit all of the changes to the DB and close the ISession
transaction.Commit();
session.Close();
到此整个项目完成了,如果大家有什么疑问欢迎和我联系。
QQ群:24651890