NHibernate之映射文件配置说明(转载3)
十二、组件(component), 动态组件(dynamic-component)
<component>元素把子对象的一些元素与父类对应的表的一些字段映射起来。 然后组件可以定义它们自己的属性、组件或者集合。
<component
name="PropertyName" (1)
class="ClassName" (2)
insert="true|false" (3)
upate="true|false" (4)
access="field|property|nosetter|ClassName" (5)
optimistic-lock="true|false" (6)
>
<property ...../>
<many-to-one .... />
........
</component>
说明:
(1) |
name: 属性名 |
(2) |
class (可选 - 默认为通过反射得到的属性类型):组件(子)类的名字。 |
(3) |
insert: 被映射的字段是否出现在SQL的INSERT语句中? |
(4) |
update: 被映射的字段是否出现在SQL的UPDATE语句中? |
(5) |
access可选 - 默认是 property): NHibernate用来访问属性的策略。 |
(6) |
optimistic-lock (可选 - 默认是 true):表明更新此组件是否需要获取乐观锁。换句话说,当这个属性变脏时,是否增加版本号(Version |
其<property>子标签为子类的一些属性与表字段之间建立映射。
<component>元素允许加入一个 <parent>子元素,在组件类内部就可以有一个指向其容器的实体的反向引用。
<dynamic-component>元素允许把一个 IDictionaryp映射为组件,其属性名对应键值。 参见第 8.5 节 “动态组件 (Dynamic components)”.
十三、子类(subclass)
<subclass
name="ClassName" (1)
discriminator-value="discriminator_value" (2)
proxy="ProxyInterface" (3)
lazy="true|false" (4)
dynamic-update="true|false"
dynamic-insert="true|false"> <property .... />
.....
</subclass>
说明:
(1) |
name: 子类的全限定名。 |
(2) |
discriminator-value (辨别标志) (可选 - 默认为类名):一个用于区分每个独立的子类的值。 |
(3) |
proxy(代理) (可选): 指定一个类或者接口,在延迟装载时作为代理使用。 |
(4) |
lazy(可选, 默认是true): 设置为 lazy="false" 禁止使用延迟抓取。 |
每个子类都应该定义它自己的持久化属性和子类。 <version> 和<id>属性可以从根父类继承下来。 在一棵继承树上的每个子类都必须定义一个唯一的discriminator-value。如果没有指定,就会使用.NET类的全限定名。
十四、连接的子类(joined-subclass)
<joined-subclass
name="ClassName" (1)
proxy="ProxyInterface" (2)
lazy="true|false" (3)
dynamic-update="true|false"
dynamic-insert="true|false"> <key .... > <property .... />
.....
</joined-subclass>
说明:
(1) |
name: 子类的全限定名。 |
(2) |
proxy (可选): 指定一个类或者接口,在延迟装载时作为代理使用。 |
(3) |
lazy(可选, 默认是 true): 设置为 lazy="false" 禁止使用延迟装载。 等价于设置proxy为自身类。 |
这种映射策略不需要指定辨别标志(discriminator)字段。但是,每一个子类都必须使用 <key>元素指定一个表字段来持有对象的标识符。本章开始的映射可以被用如下方式重写:
<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Eg"
namespace="Eg"> <class name="Cat" table="CATS">
<id name="Id" column="uid" type="Int64">
<generator class="hilo"/>
</id>
<property name="BirthDate" type="Date"/>
<property name="Color" not-null="true"/>
<property name="Sex" not-null="true"/>
<property name="Weight"/>
<many-to-one name="Mate"/>
<set name="Kittens">
<key column="MOTHER"/>
<one-to-many class="Cat"/>
</set>
<joined-subclass name="DomesticCat" table="DOMESTIC_CATS">
<key column="CAT"/>
<property name="Name" type="String"/>
</joined-subclass>
</class> <class name="Dog">
<!-- mapping for Dog could go here -->
</class> </hibernate-mapping>
十五、联合子类(union-subclass)
<union-subclass
name="ClassName" (1)
table="tablename" (2)
proxy="ProxyInterface" (3)
lazy="true|false" (4)
dynamic-update="true|false"
dynamic-insert="true|false"
schema="schema"
catalog="catalog"
extends="SuperclassName"
abstract="true|false"
persister="ClassName"
subselect="SQL expression"
entity-name="EntityName"
node="element-name"> <property .... />
.....
</union-subclass>
说明:
(1) |
name: 子类的全限定名。 |
(2) |
table: 子类的表名 |
(3) |
proxy (可选): 指定一个类或者接口,在延迟装载时作为代理使用。 |
(4) |
lazy (可选, 默认是 true): 设置为 lazy="false" 禁止使用延迟装载。 |
这种映射策略不需要指定辨别标志(discriminator)字段。
十六、连接(join)
<join
table="tablename" (1)
schema="owner" (2)
fetch="join|select" (3)
inverse="true|false" (4)
optional="true|false"> (5) <key ... /> <property ... />
...
</join>
说明:
(1) |
table: 被连接表的名称。 |
(2) |
schema (可选):覆盖由根<hibernate-mapping>元素指定的模式名称。 |
(3) |
fetch (可选 - 默认是 join): 如果设置为默认值join, NHibernate 将使用一个内连接来得到这个类或其超类定义的join ,而使用一个外连接来得到其子类定义的join。如果设置为select, 则 NHibernate 将为子类定义的 join使用顺序选择。 这仅在一行数据表示一个子类的对象的时候才会发生。对这个类和其超类定义的join,依然会使用内连接得到。 |
(4) |
inverse(可选 - 默认是 false): 如果打开,NHibernate 不会插入或者更新此连接定义的属性。 |
(5) |
optional (可选 - 默认是 false): 如果打开,NHibernate 只会在此连接定义的属性非空时插入一行数据,并且总是使用一个外连接来得到这些属性。 |
例如,一个人(person)的地址(address)信息可以被映射到单独的表中(并保留所有属性的值类型语义):
<class name="Person"
table="PERSON"> <id name="id" column="PERSON_ID">...</id> <join table="ADDRESS">
<key column="ADDRESS_ID"/>
<property name="address"/>
<property name="zip"/>
<property name="country"/>
</join>
此特性常常对遗留数据模型有用,我们推荐表个数比类个数少,以及细粒度的领域模型。然而,在单独的继承树上切换继承映射策略是有用的,后面会解释这点。
十七、引用
假设你的应用程序有两个同样名字的持久化类,但是你不想在Hibernate查询中使用他们的全限定名。 除了依赖auto-import="true"以外,类也可以被显式地“import(引用)”。你甚至可以引用没有明确被映射的类和接口。
<import class="System.Object" rename="Universe"/>
<import
class="ClassName" (1)
rename="ShortName" (2)
/>
说明:
(1) |
class: 任何.NET类的全限定名。包括应用程序集名 |
(2) |
rename(可选 - 默认为类的全限定名): 在查询语句中可以使用的名字。 |
十八、实体(Entities)和值(values)
实体entity独立于任何持有实体引用的对象。与通常的.Net模型相比, 不再被引用的对象会被当作垃圾收集掉。实体必须被显式的保存和删除(除非保存和删除是从父实体向子实体引发的级联)。 这和ODMG模型中关于对象通过可触及保持持久性有一些不同——比较起来更加接近应用程序对象通常在一个大系统中的使用方法。 实体支持循环引用和交叉引用,它们也可以加上版本信息。
一个实体的持久状态包含指向其他实体和值类型实例的引用。值可以是原始类型,集合(不是集合中的对象), 组件或者特定的不可变对象。与实体不同,值(特别是集合和组件)是通过可触及性来进行持久化和删除的。 因为值对象(和原始类型数据)是随着包含他们的实体而被持久化和删除的,他们不能被独立的加上版本信息。 值没有独立的标识,所以他们不能被两个实体或者集合共享。
所有的NHibernate类型(如果.NET可空)除了集合类都支持null语义(继承System.ValueType)。
直到现在,我们都一直使用术语“持久类”(persistent class)来代表实体。我们仍然会这么做。 然而严格说来,不是所有的用户自定义的,带有持久化状态的类都是实体。组件就是用户自定义类,却是值语义的。
十九、基本值类型
表 5.3. System.ValueType映射类型
NHibernate类型 | .NET类型 | Database类型 | 备注 |
---|---|---|---|
AnsiChar | System.Char | DbType.AnsiStringFixedLength - 1 char | |
Boolean | System.Boolean | DbType.Boolean | 在没有指定类型(type) 属性时的默认值。 |
Byte | System.Byte | DbType.Byte | 在没有指定类型(type) 属性时的默认值。 |
Char | System.Char | DbType.StringFixedLength - 1 char | 在没有指定类型(type) 属性时的默认值。 |
DateTime | System.DateTime | DbType.DateTime - ignores the milliseconds | 在没有指定类型(type) 属性时的默认值。 |
Decimal | System.Decimal | DbType.Decimal | 在没有指定类型(type) 属性时的默认值。 |
Double | System.Double | DbType.Double | 在没有指定类型(type) 属性时的默认值。 |
Guid | System.Guid | DbType.Guid | 在没有指定类型(type) 属性时的默认值。 |
Int16 | System.Int16 | DbType.Int16 | 在没有指定类型(type) 属性时的默认值。 |
Int32 | System.Int32 | DbType.Int32 | 在没有指定类型(type) 属性时的默认值。 |
Int64 | System.Int64 | DbType.Int64 | 在没有指定类型(type) 属性时的默认值。 |
PersistentEnum | A System.Enum | 潜在类型对应的DbType | 不用在映射文件指定type="PersistentEnum".而是提供枚举的程序集全名, 让NHibernate用反射来猜测类型。枚举使用的潜在类型决定适当的DbType.。 |
Single | System.Single | DbType.Single | 在没有指定类型(type) 属性时的默认值。 |
Ticks | System.DateTime | DbType.Int64 | type="Ticks"必须被指定。 |
TimeSpan | System.TimeSpan | DbType.Int64 | 在没有指定类型(type) 属性时的默认值。 |
Timestamp | System.DateTime | DbType.DateTime - 取决于数据库支持 | type="Timestamp"必须被指定。 |
TrueFalse | System.Boolean | DbType.AnsiStringFixedLength- 一个字符,'Y' 或者'N' | type="TrueFalse"必须被指定。 |
YesNo | System.Boolean | DbType.AnsiStringFixedLength- 一个字符,'Y' 或者'N' | type="YesNo"必须被指定。 |
NHibernate Type | .NET Type | Database Type | Remarks |
---|---|---|---|
AnsiString | System.String | DbType.AnsiString | type="AnsiString"必须被指定。 |
CultureInfo | System.Globalization.CultureInfo | DbType.String - 表明文化(culture)的5个字符 | 在没有指定类型(type) 属性时的默认值。 |
Binary | System.Byte[] | DbType.Binary | 在没有指定类型(type) 属性时的默认值。 |
Type | System.Type | DbType.String 保存应用程序集权限定名。 | 在没有指定类型(type) 属性时的默认值。 |
String | System.String | DbType.String | 在没有指定类型(type) 属性时的默认值。 |
NHibernate Type | .NET Type | Database Type | Remarks |
---|---|---|---|
StringClob | System.String | DbType.String | type="StringClob"必须被指定。 整个字段在内存里可读。 |
BinaryBlob | System.Byte[] | DbType.Binary | type="BinaryBlob"必须被指定。 整个字段在内存里可读。 |
Serializable | Any System.Object 必须标注可序列化标签 | DbType.Binary | type="Serializable" 应该被指定. 如果不能为属性找到NHibernate类型,这是最后可依靠的类型。 |
NHibernate为了兼容Hibernate也支持也一些额外的Java类型名(主要是方便能够使用Hibernate代码生成的映射文件), tt class="literal">type="integer"被映射为Int32 NHibernateType,type="short" 被映射为Int16 NHibernateType 。你可以通过查看NHibernate.Type.TypeFactory类的静态构造函数的代码查看到所有的上述所有的类型转换。
NHibernate之映射文件配置说明(转载3)的更多相关文章
- NHibernate之映射文件配置说明
NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表 ...
- NHIBERNATE之映射文件配置说明(转载4)
二十.自定义值类型 开发者创建属于他们自己的值类型也是很容易的.比如说,你可能希望持久化Int64类型的属性, 持久化成为VARCHAR 字段.NHibernate没有内置这样一种类型.自定义类型 ...
- NHibernate之映射文件配置说明(转载1)
源博客:http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 1. hibernate-mapping 这个元素包括以下可选 ...
- [转]NHibernate之映射文件配置说明
1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为 ...
- NHibernate之映射文件配置说明(转载2)
六.鉴别器 在"一棵对象继承树对应一个表"的策略中,<discriminator>元素是必需的, 它定义了表的鉴别器字段. 鉴别器字段包含标志值,用于告知持久化层应 ...
- NHibernate初入门之映射文件配置说明(三)
转载逆心http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 1. hibernate-mapping 这个元素包括以下可选 ...
- NHibernate之映射文件配置说
1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为 ...
- 使用代码辅助生成工具CodeSmith -- 生成NHibernate的映射文件
首先下载CodeSmith工具:在百度云中,在CodeSmith文件夹中. 安装,使用激活工具激活. 然后下载NHibernate模板,也是在百度云中,在CodeSmith文件夹中. 之后直接点击NH ...
- 使用CodeSmith快速生成映射文件和映射类
一 CodeSmith简介 本文以表自动生成NHibernate的映射文件和映射类的实例来说明一下本软件的使用方法. CodeSmith是一种基于模板的代码生成工具,其使用类似于ASP.NET的语法来 ...
随机推荐
- 学习OpenSeadragon之二 (界面缩放与平移规则设置)
OpenSeadragon入门了解请看第一篇:http://www.cnblogs.com/yingjiehit/p/4362377.html OpenSeadragon给我们提供了很多的可选界面元素 ...
- ContentProvider URI的组成
ContentProvider URI由哪几部分组成 ContentProvider URI与HTTP URI类似,由以下4部分组成: 1.content:// 相当于HTTP URI中的http ...
- 用javascript预加载图片、css、js的方法研究
预加载的好处可以让网页更快的呈现给用户,缺点就是可能会增加无用的请求(但图片.css.js这些静态文件可以被缓存),如果用户访问的页面里面的css.js.图片被预加载了,用户打开页面的速度会快很多,提 ...
- Drupal建站过程思考——不识庐山真面目,只缘身在此山中
使用drupal与没有使用drupal,在网站的设计过程上本质是一样的!所以,我们在使用drupal建一个新网站时,要时刻联想自己在没有drupal时是如何设计开发的. 不使用drupal时,我们通常 ...
- 关于latex的使用随笔
1.the context after paragraph topic to new line /paragraph{xxxx}~{} 2.关于表格中文本过长自动换行问题的解决 P.S.:直接贴一段写 ...
- Spark运行问题备忘一(网络搜集)
问题一 ERROR storage.DiskBlockObjectWriter: Uncaught exception -9ca8//shuffle_1_1562_27 java.io.FileNot ...
- 安装centos mini版,无法联网,用yum安装软件提示 cannot find a valid baseurl for repo:base/7/x86_64 的解决方法
*无法联网的明显表现会有: cannot find a valid baseurl for repo:base/7/x86_64 1.yum install出现 Error: cannot find ...
- 【持久化框架】Mybatis与Hibernate的详细对比
前言 这篇博文我们重点分析一下Mybatis与hibernate的区别,当然在前面的博文中我们已经深入的研究了Mybatis和Hibernate的原理. Mybatis [持久化框架]Myba ...
- Practice: Process logs with Apache Hadoop
http://www.ibm.com/developerworks/library/os-log-process-hadoop/ Analyzing Apache logs with Apache P ...
- Big Data Security Part One: Introducing PacketPig
Series Introduction Packetloop CTO Michael Baker (@cloudjunky) made a big splash when he presented ‘ ...