服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

nhibernate源代码浅读

曾经了解过hibernate, 印象很深,是个很不错得o/r mapping fw. 在http://nhibernate.sourceforge.net/上有个从java移植过来得.net版本--nhibernate(以下称nh),不过目前还处于prealpha build 2阶段.

出于兴趣以及学习.net得目的, 花了两天仅看了很小一部分代码:一来源代码注释并不丰富,二来对于hibernate/nhibernate的使用也很不熟悉,三来有些知识点还不熟悉.

准备工作如下:
1. nhibernate prealpha build 2
2. nunit
3. nhibernate配置文件 monitoring.dll.config 如下:


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configsections>
    <section name="nhibernate" type= "system.configuration.namevaluesectionhandler,system,version=1.0.3300.0,culture=neutral, publickeytoken=b77a5c561934e089" />
  </configsections>
  <nhibernate>
    <add key="hibernate.show_sql" value="false"/><!-- 设置是否输出sql语句到console  -->
    <add key="hibernate.connection.provider" value="nhibernate.connection.driverconnectionprovider" />
    <add key="hibernate.dialect" value="nhibernate.dialect.mssql2000dialect" /><!--设置使用sql server的方言,毕竟不同db的sql有或多或少的区别 -->
    <add key="hibernate.connection.driver_class" value="nhibernate.driver.sqlclientdriver" /> <!-- 设置使用的db驱动-->
    <add key= "hibernate.connection.connection_string"value="server=zephyr;initial catalog= argus;userid=sa;password=zephyr;min pool size=2" /> <!-- 设置连接串 -->
  </nhibernate>
</configuration>



可以看出以上是一个标准得config文件,一般由system.configuration.configurationsettings.getconfig方法来读取.
蓝色部分才是真正配置nh的地方, 例子中我配置它使用sql server, 那些key/value的含义很好明白.
值得注意得是,配置文件得文件名很重要,通常对于一个exe得assembly来说,是assemblyname.config,不过对于dll assembly来,对应的配置文件为assemblyname.dll.config 例如:
myassy.exe -> myassy.config
myassy.dll -> myassy.dll.config

我打算在我的monitoring.dll,一个用来监视性能东东中使用nh来持久化数据. 该类库包含了一个testcase,由nunit来调用

4.将要被持久化的对象, 即business object(bo)

using system;
namespace argus.monitoring
{
     public class monitor
     {
       //dbid & dbid 是nh必须要求的主键
         private int dbid;
         public int  dbid{set{dbid=value;}get{return dbid;}}
         public string monitortype {get{return "dummy monitor";}}
         public double value {get{return 12.34;} 
         public string category{get{return "this is category";}}
         public string name{get{return "this is name";}}
         public string instance{get{return "this is instance";}}
         public string computer{get{return "this is computer";}}

 
     

}
}

这是一个被极度简化的类,省略了member method,甚至property的set方法,因为我打算先试试insert功能,然后再尝试load功能

5. 写一个该bo对应的最简单的映射文件

--><?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">

  <!-- 指明bo的全名和所在assembly的名字以及在数据库中对应的表名-->
  <class name="argus.monitoring.monitor,monitoring" table= "record">
    <id name="dbid" type="int32">
      <generator class="identity"/><!-- 在数据库表中 id列设成自动加一的主键-->
    </id>
    <!--若不设column属性,则默认bo中属性名称和表中字段名一致,若不指明type,则通过反射bo的属性来得到列的数据类型-->
    <property name="computer" type="string(50)"/>
    <property name="category" type="string(50)"/>
    <property name="name" column="counter" type="string(50)"/>
    <property name="instance" type="string(50)"/>
     <!--此处bo的value属性被映射到data列-->
    <property name="value" column="data" type="double"/>
    <property name="monitortype" type="string(50)"/>
  </class>
</hibernate-mapping>

6. 最后一步 (好累啊~~~), testcase:
 

using system;

using nunit.framework;

using nhibernate;

using argus.monitoring;

namespace test.monitoring

 {

 [testfixture]

  public class monitoringtest

 {

  [test] public void nhibernatetest ()

 {

  argus.monitoring.monitor m=new argus.monitoring.monitor ();

  nhibernate.cfg.configuration cfg=new nhibernate.cfg.configuration ();

  cfg.addxmlfile ("argus.monitoring.monitor.hbm.xml");

  isession session= cfg.buildsessionfactory ().opensession();

  session.save (m);

  session.close ();

 }

 }

}

扫描关注微信公众号