二十、自定义值类型

   开发者创建属于他们自己的值类型也是很容易的。比如说,你可能希望持久化Int64类型的属性, 持久化成为VARCHAR 字段。NHibernate没有内置这样一种类型。自定义类型能够映射一个属性(或集合元素)到不止一个数据库表字段。 比如说,你可能有这样的属性: Name { get; set; },这是String类型的,对应的持久化到三个字段:FIRST_NAMEINITIALSURNAME

要实现一个自定义类型,可以实现NHibernate.UserTypes.IUserTypeNHibernate.UserTypes.ICompositeUserType中的任一个, 并且使用类型的全限定类名来定义属性。请查看 NHibernate.DomainModel.DoubleStringType这个例子,看看它是怎么做的。

<property name="TwoStrings" type="NHibernate.DomainModel.DoubleStringType, NHibernate.DomainModel">
<column name="first_string"/>
<column name="second_string"/>
</property>

 注意使用<column>标签来把一个属性映射到多个字段的做法。

  ICompositeUserTypeIEnhancedUserTypeINullableUserTypeIUserCollectionType, 和 IUserVersionType接口为更特殊的使用方式提供支持。

  你甚至可以在一个映射文件中提供参数给一个IUserType。 为了这样做, 你的UserType必须实现NHibernate.UserTypes.IParameterizedType接口。为了给自定义类型提供参数,你可以在映射文件中使用<type>元素。

<property name="priority">
<type name="MyCompany.UserTypes.DefaultValueIntegerType">
<param name="default">0</param>
</type>
</property>

  现在,IUserType 可以从传入的IDictionary对象中得到default 参数的值。

  尽管 NHibernate 内建的丰富的类型和对组件的支持意味着你可能很少 需要使用自定义类型。不过, 为那些在你的应用中经常出现的(非实体)类使用自定义类型也是一个好方法。例如, 一个MonetaryAmount类使用ICompositeUserType来映射是不错的选择,虽然他可以很容易地被映射成组件。这样做的动机之一是抽象。使用自定义类型,以后假若你改变表示金额的方法时,它可以保证映射文件不需要修改。

二十一、任意(Any)类型映射

   这是属性映射的又一种类型。<any> 映射元素定义了一种从多个表到类的多态关联。 这种类型的映射常常需要多于一个字段。第一个字段持有被关联实体的类型,其他的字段持有标识符。 对这种类型的关联来说,不可能指定一个外键约束,所以这当然不是映射(多态)关联的通常的方式。 你只应该在非常特殊的情况下使用它(比如,审计log,用户会话数据等等)。

  meta-type属性使得应用程序能指定一个将数据库字段的值映射到持久化类的自定义类型。 这个持久化类包含有用id-type指定的标识符属性。 你必须指定从meta-type的值到类名的映射。

<any name="being" id-type="Int64" meta-type="string">
<meta-value value="TBL_ANIMAL" class="Animal"/>
<meta-value value="TBL_HUMAN" class="Human"/>
<meta-value value="TBL_ALIEN" class="Alien"/>
<column name="table_name"/>
<column name="id"/>
</any>

  NHibernate也支持meta-type="class"标签,这个例子里meta-value不是必须的, 因为 meta-value就是持久化类名(persistentClass.FullName)。

<any name="being" id-type="Int64" meta-type="class">
<column name="table_name"/>
<column name="id"/>
</any>

 但你使用meta-type="class"在查询语句里设置参数时,你必须使用下面的代码:

SetParameter("paramName", typeof(YourClass).FullName, NHibernateUtil.ClassMetaType)

 映射文件部分:

<any
name="propertyName" (1)
id-type="idtypename" (2)
meta-type="metatypename" (3)
cascade="cascade_style" (4)
access="field|property|ClassName" (5)
optimistic-lock="true|false" (6)
>
<meta-value ... />
<meta-value ... />
.....
<column .... />
<column .... />
.....
</any>

 说明:

(1)

name: 属性名。

(2)

id-type: 标识符类型。

(3)

meta-type (可选 -默认是 string): 允许辨别标志(discriminator)映射的任何类型。

(4)

cascade (可选 -默认是none): 级联的类型。

(5)

access (可选 -默认是 property): NHibernate 用来访问属性值的策略。

(6)

optimistic-lock (可选 -默认是 true): 表明更新此组件是否需要获取乐观锁。换句话说,当这个属性变脏时,是否增加版本号(Version) 。

二十二、SQL中引号包围的标识符

   你可强制NHibernate在生成的SQL中把标识符用引号前后包围起来,这需要在映射文档中使用反向引号(`)把表名或者字段名包围(可能比较拗口,请看下面的例子)。NHibernate会使用相应的SQLDialect(方言)来使用正确的引号风格(通常是双引号,但是在SQL Server中是括号,MySQL中是反向引号)。
<class name="LineItem" table="`Line Item`">
<id name="Id" column="`Item Id`"/><generator class="assigned"/></id>
<property name="ItemNumber" column="`Item #`"/>
...
</class>

二十三、模块化映射文件

   允许在独立的映射文档中定义subclassjoined-subclass,直接位于hibernate-mapping下。这就可以让你每次扩展你的类层次的时候,加入新的映射文件就行了。在子类的映射中你必须指定一个extends属性,指明先前已经映射过的超类。使用这个功能的时候,一定要注意映射文件的排序是非常重要的!
<hibernate-mapping>
<subclass name="Eg.Subclass.DomesticCat, Eg"
extends="Eg.Cat, Eg" discriminator-value="D">
<property name="name" type="string"/>
</subclass>
</hibernate-mapping>

二十四、数据库生成属性(Generated Properties)

   Generated properties指的是其值由数据库生成的属性。一般来说,如果对象有任何属性由数据库生成值,NHibernate应用程序需要进行刷新(Refresh)。但如果把属性标明为generated,就可以转由NHibernate来负责这个动作。实际上。对定义了generated properties的实体,每当NHibernate执行一条SQL INSERT或者UPDATE语句,会立刻执行一条select来获得生成的值。

  被标明为generated的属性还必须是 non-insertable和 non-updateable的。只有(version)(可选),时间戳 (可选)和属性可以被标明为generated。

  • never (默认) 标明此属性值不是从数据库中生成。
  • insert - 标明此属性值在insert的时候生成,但是不会在随后的update时重新生成。比如说创建日期就归属于这类。
  • always - 标明此属性值在insert和update时都会被生成。

二十五、数据库辅助对象

   帮助CREATE和DROP任意数据库对象,与NHibernate的schema交互工具组合起来,可以提供在NHibernate映射文件中完全定义用户schema的能力。虽然这是为创建和销毁trigger(触发器)或stored procedure(存储过程)等特别设计的,实际上任何可以在IDbCommand.ExecuteNonQuery()方法中执行的SQL命令都可以在此使用(比如ALTER, INSERT,等等)。本质上有两种模式来定义辅助数据库对象。

  第一种模式是在映射文件中显式声明CREATE和DROP命令:

<nhibernate-mapping>
...
<database-object>
<create>CREATE TRIGGER my_trigger ...</create>
<drop>DROP TRIGGER my_trigger</drop>
</database-object>
</nhibernate-mapping>

  第二种模式是提供一个类,这个类知道如何组织CREATE和DROP命令。这个特别类必须实现NHibernate.Mapping.IAuxiliaryDatabaseObject接口。

<hibernate-mapping>
...
<database-object>
<definition class="MyTriggerDefinition, MyAssembly"/>
</database-object>
</hibernate-mapping>

 你也可以在配置文件里设置参数传给数据库对象。

<hibernate-mapping>
...
<database-object>
<definition class="MyTriggerDefinition, MyAssembly">
<param name="parameterName">parameterValue</param>
</definition>
</database-object>
</hibernate-mapping>

NHibernate可以调用IAuxiliaryDatabaseObject.SetParameterValues方法接受dictionary参数。

  还有,这些数据库对象可以特别指定为仅在特定的方言中才使用。

<hibernate-mapping>
...
<database-object>
<definition class="MyTriggerDefinition"/>
<dialect-scope name="NHibernate.Dialect.Oracle9Dialect"/>
<dialect-scope name="NHibernate.Dialect.OracleDialect"/>
</database-object>
</hibernate-mapping>

NHIBERNATE之映射文件配置说明(转载4)的更多相关文章

  1. NHibernate之映射文件配置说明

    NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表 ...

  2. NHibernate之映射文件配置说明(转载3)

    十二.组件(component), 动态组件(dynamic-component) <component>元素把子对象的一些元素与父类对应的表的一些字段映射起来. 然后组件可以定义它们自己 ...

  3. NHibernate之映射文件配置说明(转载1)

    源博客:http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 1. hibernate-mapping 这个元素包括以下可选 ...

  4. [转]NHibernate之映射文件配置说明

    1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为 ...

  5. NHibernate之映射文件配置说明(转载2)

    六.鉴别器   在"一棵对象继承树对应一个表"的策略中,<discriminator>元素是必需的, 它定义了表的鉴别器字段. 鉴别器字段包含标志值,用于告知持久化层应 ...

  6. NHibernate初入门之映射文件配置说明(三)

    转载逆心http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 1. hibernate-mapping 这个元素包括以下可选 ...

  7. NHibernate之映射文件配置说

    1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为 ...

  8. 使用代码辅助生成工具CodeSmith -- 生成NHibernate的映射文件

    首先下载CodeSmith工具:在百度云中,在CodeSmith文件夹中. 安装,使用激活工具激活. 然后下载NHibernate模板,也是在百度云中,在CodeSmith文件夹中. 之后直接点击NH ...

  9. 使用CodeSmith快速生成映射文件和映射类

    一 CodeSmith简介 本文以表自动生成NHibernate的映射文件和映射类的实例来说明一下本软件的使用方法. CodeSmith是一种基于模板的代码生成工具,其使用类似于ASP.NET的语法来 ...

随机推荐

  1. Menu之选项菜单

    Android有三种形式的菜单:选项菜单(optionMenu).上下文菜单(ContextMenu).子菜单(subMenu).最常用的是选项菜单,该菜单在点击menu按键后会在对应的Activit ...

  2. jQuery extend方法介绍

    jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object);为扩展jQ ...

  3. 在ubuntu14.14 安装php扩展扩展出现的问题

    我是在ubuntu14.14 安装的 lnmp. 部分扩展.均已安装好,但是我用apt-get 方式安装 redis和curl扩展时,我的配置都设置但是从phpinfo里面看没有响应的配置项. 于是我 ...

  4. ActiveRecord 模式杂谈

    ActiveRecord也属于ORM(对象关系映射)层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性.配合遵循的命名和配置惯例,能够很大程度的快速实现模 ...

  5. 【创建型】Singleton模式

    单例模式可以说是所有23种设计模式中最为简单的一个,没有之一.其主要思想就是保证整个应用环境中,最多只会有一个对象的实例.类关系图参考如下: 在c++中,单例模式的实现,较为常用的实现方式一般为: n ...

  6. python中如何单独测试一个函数的作用

    #!/usr/bin/python import os def get_env_varible(key): return os.getenv(key) if __name__ == '__main__ ...

  7. 遍历元素绑定事件时作用域是怎么回事啊,为什么要用this关键字,而直接使用元素本身就不行?

    如下代码,将this改为rows[i]为啥不起作用了 var rows = document.getElementsByTagName("tr"); for(var i=0;i&l ...

  8. reaver 使用方法和技巧

    reaver非常的不错,为我们ceng网带了最大的方便,使用简单,我来讲一下自己使用心得吧! 第一步,如果用虚拟机用vmware的,总会出现鼠标不灵点不到地方,换了一个 6.0.2 build-598 ...

  9. Jackknife,Bootstraping, bagging, boosting, AdaBoosting, Rand forest 和 gradient boosting的区别

    引自http://blog.csdn.net/xianlingmao/article/details/7712217 Jackknife,Bootstraping, bagging, boosting ...

  10. reg51.h 详解

    /* BYTE Register */ sfr P0 = 0x80; //P0口 sfr P1 = 0x90; //P1口 sfr P2 = 0xA0; //P2口 sfr P3 = 0xB0; // ...