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

源博客:http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html


1. hibernate-mapping

  这个元素包括以下可选的属性。schema属性,指明了这个映射所引用的表所在的schema名称。假若指定了这个属性,
表名会加上所指定的schema的名字扩展为全限定名。假若没有指定,表名就不会使用全限定名。default-cascade 指定了未明确注明cascade属性的.Net属性和集合类.Net会采取什么样的默认级联风格。 auto-import属性默认让我们在查询语言中可以使用非全限定名的类名。assemblynamespace指定了持久化类的应用程序集名称和其所在的名称空间名。


<hibernate-mapping
schema="schemaName" (1)
default-cascade="none|save-update" (2)
auto-import="true|false" (3)
assembly="Eg" (4)
namespace="Eg" (5)
/>

 各选项说明:















(1)

schema (optional): 数据库schema名称。

(2)

default-cascade (可选 - 默认为 none):
默认的级联风格。

(3)

auto-import (optional - defaults
to true): 指定我们在使用查询语句的时候是否可以使用非全限定名。

(4)(5)

assembly and namespace(可选):
指定映射文件中的类的应用程序集名称和其所在的名称空间名,用来生成类的非全限定名。

  如果没有设置assemblynamespace标签,我们不得不使用类的非全限定名 (namespace.类名,assembly).

  假若你有两个持久化类,它们的非全限定名是一样的,你应该设置auto-import="false"。
假若说你把一个“import过”的名字同时对应两个类, NHibernate会抛出一个异常。

二. class

你可以使用class元素来定义一个持久化类:


<class
name="ClassName" (1)
table="tableName" (2)
discriminator-value="discriminator_value" (3)
mutable="true|false" (4)
schema="owner" (5)
proxy="ProxyInterface" (6)
dynamic-update="true|false" (7)
dynamic-insert="true|false" (8)
select-before-update="true|false" (9)
polymorphism="implicit|explicit" (10)
where="arbitrary sql where condition" (11)
persister="PersisterClass" (12)
batch-size="N" (13)
optimistic-lock="none|version|dirty|all" (14)
lazy="true|false" (15)
abstract="true|false"              (16)
/>

各选项说明:


















































(1)

name: 持久化类(或者接口)的.NET全限定名。

(2)

table: 对应的数据库表名。

(3)

discriminator-value(辨别值) (可选 -
默认和类名一样):一个用于区分不同的子类的值,在多态行为时使用。可选值包括nullnot null

(4)

mutable (可选, 默认值为 true):
表明该类的实例可变(不可变)。

(5)

schema (可选) 覆盖在根元素中指定的schema名字。

(6)

proxy (可选)指定一个接口,在延迟装载时作为代理使用。你可以在这里使用该类自己的名字。

(7)

dynamic-update (可选,默认为false): 指定用于UPDATE 的SQL将会在运行时动态生成,并且只更新那些改变过的字段。

(8)

dynamic-insert (可选, 默认为false):
指定用于 INSERT的 SQL
将会在运行时动态生成,并且只包含那些非空值字段。

(9)

select-before-update (可选,默认值为 false):
指定NHibernate除非确定对象的确被修改了,UPDATE操作。在特定场合(实际上,只会发生在一个临时对象关联到一个新的session中去,执行update()的时候),这说明NHibernate会在UPDATE之前执行一次额外的SQLSELECT操作,来决定是否应该进行UPDATE。

(10)

polymorphism (可选, 默认值为 implicit (隐式)):
界定是隐式还是显式的使用查询多态。

(11)

where (可选) 指定一个附加的SQL WHERE 条件,在抓取这个类的对象时会一直增加这个条件。

(12)

persister (可选): 指定一个定制的 IClassPersister

(13)

batch-size (可选,默认是1)
指定一个用于根据标识符抓取实例时使用的"batch size"(批次抓取数量)。

(14)

optimistic-lock (乐观锁定) (可选,默认是version):
决定乐观锁定的策略。

(15)

lazy (可选): 假若设置lazy="false",就会禁用延迟加载。

(16)

abstract(可选) 用于在<union-subclass>的继承结构 (hierarchies)中标识抽象超类。

 若指明的持久化类实际上是一个接口,这也是完全可以接受的。 之后你可以用元素 <subclass>来指定该接口的实际实现类。 你可以持久化任何static(静态的)内部类。
你应该使用标准的类名格式来指定类名,比如:Eg.Foo+Bar,
Eg
。由于HQL解析器的限制NHibernate 1.0 无法在查询里使用内部类。

  不可变类 mutable="false"不可以被应用程序更新或者删除。
这可以让NHibernate做一些小小的性能优化。

  可选的proxy属性允许延迟加载类的持久化实例。
NHibernate开始会返回实现了这个命名接口的代理类。当代理的某个方法被实际调用的时候,
真实的持久化对象才会被装载。参见下面的“用于延迟装载的代理”。

  Implicit (隐式)的多态是指,如果查询时给出的是任何超类、该类实现的接口或者该类的
名字,都会返回这个类的实例;如果查询中给出的是子类的名字,则会返回子类的实例。 Explicit (显式)的多态是指,只有在查询时给出明确的该类名字时才会返回这个类的实例;
同时只有在这个<class>的定义中作为<subclass>或者<joined-subclass>出现的子类,才会可能返回。 在大多数情况下,默认的polymorphism="implicit"都是合适的。
显式的多态在有两个不同的类映射到同一个表的时候很有用。(允许一个“轻型”的类,只包含部分表字段)。

  persister属性可以让你定制这个类使用的持久化策略。 你可以指定你自己实现NHibernate.Persister.EntityPersister的子类,你甚至可以完全从头开始编写一个NHibernate.Persister.IClassPersister接口的实现,
比如是用储存过程调用、序列化到文件或者LDAP数据库来实现。 参阅NHibernate.DomainModel.CustomPersister,这是一个简单的例子 (“持久化”Hashtable)。

  请注意dynamic-updatee和dynamic-insert的设置并不会继承到子类, 所以在<subclass>或者<joined-subclass>元素中可能
需要再次设置。这些设置是否能够提高效率要视情形而定。请用你的智慧决定是否使用。

  使用select-before-update通常会降低性能。如果你重新连接一个脱管(detache)对象实例
到一个Session中时,它可以防止数据库不必要的触发update。 这就很有用了。

如果你打开了dynamic-update,你可以选择几种乐观锁定的策略:

  • version(版本检查) 检查version/timestamp字段

  • all(全部) 检查全部字段

  • dirty(脏检查)只检察修改过的字段

  • none(不检查)不使用乐观锁定

  我们非常强烈建议你在NHibernate中使用version/timestamp字段来进行乐观锁定。
对性能来说,这是最好的选择,并且这也是唯一能够处理在session外进行操作的策略(例如: 在使用ISession.Update()的时候)。注意version或者是timestamp属性不能为null,不管是否使用了unsaved-value策略,或者是实例被作为是瞬态。

  从NHibernate 1.2.0开始,版本号从1开始(以前的版本从0开始),这样允许把version的属性的unsaved-value设置为0。

三、 id

被映射的类必须定义对应数据库表主键字段。大多数类有一个属性, 为每一个实例包含唯一的标识。
元素定义了该属性到数据库表主键字段的映射。


<id
name="PropertyName"     (1)
type="typename"     (2)
column="column_name"    (3)
unsaved-value="any|none|null|id_value"   (4)
access="field|property|nosetter|ClassName"> (5)
     <generator class="generatorClass"/>
</id>

















(1)

name (可选): 标识属性的名字。

(2)

type(可选): 标识NHibernate类型的名字。

(3)

column(可选 - 默认为属性名): 主键字段的名字。

(4)

unsaved-value (可选 -
默认为一个切合实际(sensible)的值): 一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。
这可以把这种实例和从以前的session中装载过(可能又做过修改--译者注) 但未再次持久化的实例区分开来。

(5)

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

  如果name属性不存在,会认为这个类没有标识属性。

四、(主键生成策略)generator

  可选的<generator>子元素是一个.NET类的名字,
用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数, 用元素来传递。


<id name="Id" type="Int64" column="uid" unsaved-value="0">
<generator class="NHibernate.Id.TableHiLoGenerator">
<param name="table">uid_table</param>
<param name="column">next_hi_value_column</param>
</generator>
</id>

 所有的生成器都实现NHibernate.Id.IIdentifierGenerator接口。 这是一个非常简单的接口;
某些应用程序可以选择提供他们自己特定的实现。当然, NHibernate提供了很多内置的实现。下面是一些内置生成器的快捷名字:


  1、increment

用于为int类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用


  2、identity

对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。数据库返回的主键值
返回的标识符是int类型的。


  3、sequence

在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),
而在Interbase中使用生成器(generator)。返回的标识符是int类型的。


  4、hilo

  使用一个高/低位算法来高效的生成int类型的标识符。给定一个表和字段(默认分别是是hibernate_unique_key
和next_hi)作为高位值得来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。在用户自行提供的连接中,不要使用这种生成器。


  5、seqhilo

使用一个高/低位算法来高效的生成int类型的标识符,给定一个数据库序列(sequence)的名字。


  6、uuid.hex

用一个System.Guid的ToString()方法法生成字符串类型的标识符,
字符串的长度由format参数定义。


  7、uuid.string

用一个新的System.Guid实例的byte[]转化为字符串作为标示符。


  8、guid

使用新的System.Guid实例作为标示符。


  9、guid.comb

使用Jimmy
Nilsson的算法(请参阅http://www.informit.com/articles/article.asp?p=25862)生成一个新的System.Guid标示符。


  10、native

根据底层数据库的能力选择identity, sequence 或者hilo中的一个。


  11、assigned

让应用程序在 Save()之前为对象分配一个标示符。


  12、foreign

使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。

 高/低位算法(Hi/Lo Algorithm)

  hilo 和 seqhilo生成器给出了两种hi/lo算法的实现, 这是一种很令人满意的标识符生成算法。
第一种实现需要一个“特殊”的数据库表来保存下一个可用的“hi”值。 第二种实现使用一个Oracle风格的序列(在被支持的情况下)。


<id name="Id" type="Int64" column="cat_id">
<generator class="hilo">
<param name="table">hi_value</param>
<param name="column">next_value</param>
<param name="max_lo">100</param>
</generator>
</id>
<id name="Id" type="Int64" column="cat_id">
<generator class="seqhilo">
<param name="sequence">hi_value</param>
<param name="max_lo">100</param>
</generator>
</id>

很不幸,你在为NHibernate自行提供IDbConnection时无法使用hilo
NHibernate必须能够在一个事务里获取"hi"值。

  UUID算法(UUID Algorithm )


<id name="Id" type="String" column="cat_id">
<generator class="uuid.hex">
<param name="format">format_value</param>
<param name="seperator">seperator_value</param>
</generator>
</id>

  UUID算法是调用Guid.NewGuid().ToString(format)方法生成标示符。 format参数的使用请参阅MSDN,GUID的默认分隔符是-
这个基本不会改动。format可以决定是都替换默认的默认分隔符。 The UUID
is generated by callingGuid.NewGuid().ToString(format)

   UUID字符串算法

  这个算法调用Guid.NewGuid().ToByteArray()方法获取byte[], 然后将byte[]转换为char[]char[]被作为一个长度 为16的字符串返回。

  GUID 算法

  guid标示符通过调用 Guid.NewGuid()创建。当在MSSQL中使用Guids标示符时做主键,外键或者是索引是为了获取更好的性能
通常使用 guid.comb。其他支持GUIDs标示的的数据库使用guid.comb能否获得性能的提升未知。

  标识字段和序列(Identity columns and
Sequences)

  对于内部支持标识字段的数据库(DB2,MySQL,Sybase,MS SQL),你可以使用identity关键字生成。
对于内部支持序列的数据库(DB2,Oracle, PostgreSQL, Interbase, McKoi,SAP DB),
你可以使用sequence风格的关键字生成。 这两种方式对于插入一个新的对象都需要两次SQL查询。

对于跨平台开发,native策略会从identity, sequence
和hilo中进行选择,选择哪一个,这取决于底层数据库的支持能力。

  程序分配的标识符(Assigned Identifiers)

  如果你需要应用程序分配一个标示符(而非NHibernate来生成它们),你可以使用assigned生成器。
这种特殊的生成器会使用已经分配给对象的标识符属性的标识符值。用这种特性来分配商业行为的关键字要特别小心(基本上总是一种可怕的设计决定)。

  因为其继承天性,使用这种生成器策略的实体不能通过ISession的SaveOrUpdate()方法保存。作为替代,
你应该明确告知NHibernate是应该被save还是update,分别调用ISession的Save()或Update()方法。

五、composite-id 联合ID


<composite-id
name="PropertyName"
class="ClassName"
unsaved-value="any|none"
access="field|property|nosetter|ClassName">
<key-property name="PropertyName" type="typename" column="column_name"/>
<key-many-to-one name="PropertyName class="ClassName" column="column_name"/></composite-id>

 如果表使用联合主键,你可以把类的多个属性组合成为标识符属性。<composite-id> 元素接受<key-property>属性映射和<key-many-to-one>属性映射作为子元素。


<composite-id>
<key-property name="MedicareNumber"/>
<key-property name="Dependent"/>
</composite-id>

  你的持久化类必须重载 Equals()GetHashCode()方法,来实现组合的标识符判断等价.也必须实现可序列化

  不幸的是,这种组合关键字的方法意味着一个持久化类是它自己的标识。除了对象自己之外,
没有什么方便的“把手”可用。你必须自己初始化持久化类的实例,在使用组合关键字load()持久化状态之前,
必须填充他的联合属性。我们会在7.4. 组件作为联合标识符(Components
as composite identifiers)
第 7.4 节 “组件作为联合标识符(Components as composite
identifiers)”章中说明一种更加方便的方法, 把联合标识实现为一个独立的类,下面描述的属性只对这种备用方法有效:

  • name (可选):一个组件类型,持有联合标识(参见下一节)。

  • access (可选 - 默认为property):
    NHibernate应该使用的访问此属性值的策略

  • class (可选 - 默认为通过反射(reflection)得到的属性类型) :
    作为联合标识的组件类名(参见下一节)。

NHibernate之映射文件配置说明(转载1),布布扣,bubuko.com

时间: 2024-10-13 16:09:48

NHibernate之映射文件配置说明(转载1)的相关文章

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

十二.组件(component), 动态组件(dynamic-component) <component>元素把子对象的一些元素与父类对应的表的一些字段映射起来. 然后组件可以定义它们自己的属性.组件或者集合. <component name="PropertyName" (1) class="ClassName" (2) insert="true|false" (3) upate="true|false"

NHibernate之映射文件配置说明

NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为全限定名.假若没有指定,表名就不会使用全限定名.default-cascade 指定了未明确注明cascade属性的.Net属性和集合类.Net会采取什么样的默认级联风格. auto-import属性默认让我们在查询语言中可以使用非全限定名的类名.assemb

NHIBERNATE之映射文件配置说明(转载4)

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

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

1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为全限定名.假若没有指定,表名就不会使用全限定名.default-cascade 指定了未明确注明cascade属性的.Net属性和集合类.Net会采取什么样的默认级联风格. auto-import属性默认让我们在查询语言中可以使用非全限定名的类名.assembly和 namespace指定了持久化类

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

六.鉴别器 在"一棵对象继承树对应一个表"的策略中,<discriminator>元素是必需的, 它定义了表的鉴别器字段. 鉴别器字段包含标志值,用于告知持久化层应该为某个特定的行创建哪一个子类的实例. 如下这些受到限制的类型可以使用: String, Char, Int32,Byte, Short, Boolean , YesNo, TrueFalse. <discriminator column="discriminator_column" (

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

转载逆心http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为全限定名.假若没有指定,表名就不会使用全限定名.default-cascade 指定了未明确注明cascade属性的.Net属性和集合类.Net会采取什么样的默认

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

首先下载CodeSmith工具:在百度云中,在CodeSmith文件夹中. 安装,使用激活工具激活. 然后下载NHibernate模板,也是在百度云中,在CodeSmith文件夹中. 之后直接点击NHibernate中的模板文件. 之后的教程:http://www.2cto.com/database/201408/322382.html

ORM利器:NHibernate(二)使用CodeSmith快速生成映射文件和映射类

    在上一篇文章<ORM利器:NHibernate(一)简介>,我们对NHibernate做了简要介绍,接下来的系列文章将以Demo的形式和大家分享使用NHibernate的初步使用. 一 CodeSmith简介 本文以表自动生成NHibernate的映射文件和映射类的实例来说明一下本软件的使用方法.     CodeSmith是一种基于模板的代码生成工具,其使用类似于ASP.NET的语法来生成任意类型的代码和文件.使用 CodeSmith,可以生成包括简单的强类型集合和完整应用程序在内的

hibernate 的映射文件快速生成:使用CodeSmith快速生成映射文件和映射类

一 CodeSmith简介 本文以表自动生成NHibernate的映射文件和映射类的实例来说明一下本软件的使用方法. CodeSmith是一种基于模板的代码生成工具,其使用类似于ASP.NET的语法来生成任意类型的代码和文件.使用 CodeSmith,可以生成包括简单的强类型集合和完整应用程序在内的任何东西.(弱类型-没有明显的类型,会随着环境的不同自动变换类型:强类型-在声明时规定其数据类型,保证类的安全,虽然系统也有一定的默认转换,但是没有弱类型那么随便) 当您生成应用程序时,您经常需要重复