zoukankan      html  css  js  c++  java
  • NHibernate in action翻译——第二章 2.3(基本配置)

    2.3 基本配置

    NHibernate可以配置到几乎在所有的.NET应用程序中运行。一般来说,NHibernate使用两到三层的服务器客户端。客户端通常是一个网站,但是也可以是一个桌面式应用程序。虽然我们在这本书只关注网站,但我们也会覆盖桌面程序。

    首先从Configuration实例中创建一个ISessionFactory实例。

    2.3.1 创建SessionFactory

         为了去创建一个ISessionFactory实例,你首先要在程序初始化时创建一个Configuration实例,然后使用它去设置数据库和映射的信息。一旦配置完成,Configuration实例就可以用来创建SessionFactory。之后,你就可丢弃Configuration实例。

         在之前的例子中,我们使用了一个MySessionFactory的静态属性去创建ISession实例,下面是它的定义:

       映射文件Employee.hbm.xml的位置跟应用程序的当前目录有关。在这个例子中,你也可以使用XML文件区设置所有的配置。

    方法链

    方法链是一种编程风格,它被很多的NHibernate接口支持。这种风格在Smalltalk中要比在.NET中流行,它被认为是可读性低、更难去理解,但是它在很多情况下非常方便。

    很多的.NET开发者定义没有返回值的方法。在Smalltalk中,是没有void类型的,它通常返回它接收的对象。这可以让你去重写上面的代码:

     

    ISessionFactory sessionFactory =new Configuration()

          .Configure()

          .AddXmlFile(“Employee.hbm.xml”)

          .BuildSessionFactory();

     

    注意到你不需要定义一个Configuration的变量。

    我们会在一些示例中使用这种风格;但是如果你不喜欢它,你可以不使用。

     

    为了方便,NHibernateXML映射文件以.hbm.xml扩展名为后缀,每一个类配备一个映射文件,而不是把所有的映射放在一个文件中(这被认为是一种坏的设计)。“Hello World”示例只有一个持久化类,因此只有一个映射文件。但是如果你有多个持久化类,你应该为每个持久化类配置一个映射文件。那么在哪里放置映射文件呢?

    映射文件

    映射文件最好跟持久化类放置在同一个目录下。例如Employee类的映射文件应该命名为Employee.hbm.xml,放置在与Employee.cs同一目录下。我建议你跟着练习使用AddXmlFile()去加载多个映射文件。

    你也可以把XML映射文件嵌入到.NET中。那么你就必须告诉编译器每一个文件是嵌入文件;Visual Studio可以很容易的完成这个任务。然后使用AddClass()方法,使用如下:

     

    ISessionFactory sessionFactory = new Configuration()

       .Configure()

       .AddClass(typeof(Model.Item))

       .AddClass(Typeof(Model.User))

       .AddClass(Typeof(Model.Bid))

       .BuildSessionFactory();

     

    AddClass()方法假设映射文件的后缀名为.hbm.xml而且内嵌在跟类文件同一个引用下。

    如果你想添加所有的内嵌映射文件,你可以使用方法AddAssembly()

     

    ISessionFactory sessionFactory = new Configuration()

       .Configure()

       .AddInputStream(// .NET Attributes

             HbmSerializer.Default.Serialize(typeof(Model.Item).Assembly))

       .AddAssembly(typeof(Model.Item).Assembly)//XML

       .BuildSessionFactory();

     

    提示:不要使用应用程序名作为参数(如“NHibernate.Auction”)。你要直接使用一个类的类型直接检索包含映射文件的引用。

     

    为什么NHibernate会提示不知道你的类?

    当你开始使用NHibernate时,你必须确定所有的映射文件都让NHibernate知道了,如果你漏了一个,你将会得到一个异常。当创建session Factory时,他会报一个异常:refers to an unmapped class:YourClass。当你执行一个查询的时候,他会报一个异常:possible an invalid or unmapped class name was used in the query

    为了去解决这个问题,第一步是在INFO层设置日志(将在3.3.2节介绍)。然后阅读日志;你应该找到一条信息如:Mapping class: Namespace. YourClass ->YourClass。然后检查你的初始化代码,确认是否包含所有的映射文件。

    如果你使用AddAssembly(),去确定hbm.xml文件为嵌入文件。

     

    多数据库和SESSION FACTORIES

    我们已经演示过单SessionFactory的程序了,这已经可以适用于大多数的程序需要。如果你需要多个ISessionFactory实例,以便去管理多个数据库。每一个SessionFactory被一个数据库使用,然后创建ISession实例去为特定的数据库工作。一旦你拥有了SessionFactory,你就可以去创建session,然后开始加载和保存对象。

    配置技巧

    你需要指定数据库连接,和各种能在运行时影响NHibernate行为的设置。配置文件的属性非常多,但是不要担心,大多数有默认值。只有少数需要修改的。

    为了去指定配置选项,你需要使用以下技巧:

    1、              传递一个System.Collections.IDictionary的实例给Configuration.SetProperties(),或者使用Configuration.SetProperty为每一个属性设置(或者直接使用Configuration.Properties)。

    2、              在应用程序配置文件中设置所有的属性(App.config或者Web.config)。

    3、              包含<property>元素在名为hibernate.cfg.xmlxml文件中,把这个文件放在当前目录下。

     

    第一种选择是很少使用到的,除了一些快速测试,大多数的应用程序需要一个灵活的配置文件。应用程序配置文件和hibernate.cfg.xml文件都提供相同的功能:配置NHibernate。你选择哪种方式只是你个人喜好。Hibernate.cfg.xml的取名只是一个惯例。你可以使用任何的文件名(例如NHibernate.config.config文件当ASP.NET部署是会被自动保护),然后提供文件名给Configure()方法。你可以同时使用这两种文件,一种为开发,一种为部署。

    我们很少使用非正统的方法去在打开NHibernateISession的时候让应用程序提供ADO.NET IDbConnection(例如,通过调用SessionFactory.OpenSessionmyConnection))。使用这种选择,代表你不必指定任何数据库连接的属性(其他属性还是要指定的)。我们不推荐这种做法。

    对于所有的配置选项,dagtabase-connection是最重要的,因为如果没有它,NHibernate将会不知道怎样跟数据库打交道。

    2.3.2 配置ADO.NET数据库访问

    大多数时候,应用程序有责任去获取ADO.NET的连接。NHibernate是应用程序的一部分,因此他有责任去获取这些连接。你需要告诉NHibernate怎样去获取(创建)一个ADO.NET数据库连接。

    Figure2.2显示了.NET 应用程序是怎么跟ADO.NET互相作用。没有NHibernate的时候,应用程序通常从连接池中获取一个ADO.NET连接,然后使用这个连接去执行SQL语句。

    当使用NHibernate的时候,示图改变了:NHibernate作为ADO.NET的客户端和他的连接池,如图Figure2.3所示。应用程序使用NHibernateISessionIQueryAPI来操作持久化和使用NHibernateITransactionAPI来控制数据库的事务。

    使用hibernate.cfg.xml配置NHibernate

    以下是hibernate.cfg.xml文件的代码列表,它是用来配置NHibernate去访问Microsoft SQL Server 2000数据库的。

    <?xml version="1.0" ?>

    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">

     <session-factory>

        <property name="connection.provider">

          NHibernate.Connection.DriverConnectionProvider

        </property>

        <property name="dialect">

          NHibernate.Dialect.MsSql2000Dialect

        </property>

        <property name="connection.driver_class">

          NHibernate.Driver.SqlClientDriver

        </property>

        <property name="connection.connection_string">

          Data Source=(local); Initial Catalog=nhibernate;

          Integrated Security=SSPI

        </property>

     </session-factory>

    </hibernate-configuration>

    代码指出了一下信息:

    1、              connection.provider指出了应用了IConnectionProvider接口的类名;这里我们使用默认的。

    2、              dialect指定了应用了数据库方言的名称。方言是NHibernate用来指定数据库的特性的。尽管有ANSI标准化的作用,但是SQL依然在不同的数据库中有不同的形式。你必须指定一种方言,NHibernate包含了对大多数SQL数据库的支持,和添加一种新的方言也是非常容易的。

    3、              connection.driver_class指定了应用的ADO.NET驱动。注意,当使用不完整的驱动名时,你必须添加一个<qualifyAssembly>元素在配置文件中指定符合的名字,以便NHibernate可以成功地加载它。

    4、              connection.connection_string指定了一个标准的ADO.NET连接字符串,是用来创建数据库连接的。

    开始NHibernate

    怎么样利用这些属性去开始创建NHibernate应用程序?你定义了这些属性在hibernate.cfg.xml文件中,你需要把这个文件放在应用程序目录下。当你创建一个Configuration对象和调用Configure()方法时,他会被自动地识别和读取。

    让我总结一下配置的步骤吧:

    1、    如果你的数据库ADO.NET数据驱动还没有安装,去下载和安装它;如果你正在使用SQL Server,那么你可以跳过这一步。

    2、    添加引用log4net.dll到你的项目中。这是可选的,但是推荐这样做。

    3、    决定NHibernate需要的数据库访问属性。

    4、    放置hibernate.cfg.xml文件在当前目录以便Configuration读取这些属性。

    5、    在你的应用程序中创建一个Configuration实例,调用Configure()方法;使用HbmSerializer.Default.Serialize()AddInputStream()加载映射类;使用AddAssembly()AddClass()AddXmlFile()加载映射文件。从Configuration调用BuildSessionFactory()创建一个ISessionFactory实例。

    6、    当你用完NHibernate时,记得关闭ISessionFactory(使用MySessionFactory.Close())。大多数情况,当你关闭你的应用程序时你才会关闭ISessionFactory

  • 相关阅读:
    10 个雷人的注释,就怕你不敢用!
    Java 14 之模式匹配,非常赞的一个新特性!
    poj 3661 Running(区间dp)
    LightOJ
    hdu 5540 Secrete Master Plan(水)
    hdu 5584 LCM Walk(数学推导公式,规律)
    hdu 5583 Kingdom of Black and White(模拟,技巧)
    hdu 5578 Friendship of Frog(multiset的应用)
    hdu 5586 Sum(dp+技巧)
    hdu 5585 Numbers
  • 原文地址:https://www.cnblogs.com/luluping/p/1765621.html
Copyright © 2011-2022 走看看