nhibernate

本人在学习J2ee的时候,用了一下在eclipse中使用集成好的hibernate,感觉很方便,配置也很简单,看到nhibernate出来以后,也想试一下,于是建立了这个项目,开始的时候是用的beta版,然后按官方说明中的示例没有一次是成功的,在网上搜集多方资料后,加上自己的思考写出了这个简单的项目,放于网上供大家学习。

本人用的数据库是mysql5.0,在项目中需要添加引用mysql.data

数据库 名称:test

表名:User

字段

Id     int  自动增长  为主键

name char(10)

首先建立一个项目,项目名称为nhibernate,然后添加一个新的类库项目,项目名称为 QuickStart,

建立类 User.cs

 

using  System;
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

 

<? xml version="1.0" encoding="utf-8"  ?>

  
< 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

 


 

<? xml version="1.0" encoding="utf-8"  ?>
< 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();
         
//     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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值