NHibernate之映射文件配置说明(转载2)
六、鉴别器
<discriminatorcolumn="discriminator_column" (1)type="discriminator_type" (2)force="true|false" (3)insert="true|false" (4)formula="arbitrary SQL expression" (5) />
说明:
(1) |
column (可选 - 默认为 class) 鉴别器字段的名字 |
(2) |
type (可选 - 默认为 String) 一个NHibernate字段类型的名字。 |
(3) |
force(强制) (可选 - 默认为 false) "强制"NHibernate指定允许的鉴别器值,即使当取得的所有实例都是根类的。 |
(4) |
insert (可选 - 默认为true) 如果你的鉴别器字段也是映射为复合标识(composite identifier)的一部分, 则需将 这个值设为false。 |
(5) |
formula (可选) 一个SQL表达式,在类型判断(判断是父类还是具体子类-译注)时执行。可用于基于内容的鉴别器。 |
鉴别器字段的实际值是根据discriminator-value 和<class> and <subclass>元素中 的discriminator-value属性得来的。
force属性仅仅在这种情况下有用的:表中包含没有被映射到持久化类的附加辨别器值。 这种情况不会经常遇到。
使用formula属性你可以定义一个SQL表达式,用来判断一个行数据的类型。
<discriminator formula="case when CLASS_TYPE in ('a', 'b', 'c') then 0 else 1 end" type="Int32"/>
七、版本(version)(可选)
<versioncolumn="version_column" (1)name="PropertyName" (2)type="typename" (3)access="field|property|nosetter|ClassName" (4)unsaved-value="null|negative|undefined|value" (5)generated="never|always" (6) />
说明:
(1) |
column (可选 - 默认为属性名): 指定持有版本号的字段名。 |
(2) |
name 持久化类的属性名。 |
(3) |
type (可选 - 默认是 Int32): 版本号的类型。 |
(4) |
access (可选 - 默认是 property): NHibernate用于访问属性值的策略。 |
(5) |
unsaved-value(可选 - 默认是undefined): 用于标明某个实例时刚刚被实例化的(尚未保存)版本属性值, 依靠这个值就可以把这种情况 和已经在先前的session中保存或装载的脱管(detached)实例区分开来。 (undefined指明应被使用的标识属性值。) |
(6) |
generated(可选 - 默认是 never): 表明此版本属性值是否实际上是由数据库生成的。 请参阅 5.5 “数据库生成属性(Generated Properties)”部分的讨论。 |
版本号必须是以下类型:Int64, Int32, Int16, Ticks,或者Timestamp, TimeSpan。
八、timestamp (可选)
<timestampcolumn="timestamp_column" (1)name="PropertyName" (2)access="field|property|nosetter|ClassName" (3)unsaved-value="null|undefined|value" (4)generated="never|always" (5) />
说明:
(1) |
column(可选 - 默认为属性名): 持有时间戳的字段名。 |
(2) |
name: 在持久化类中的.NE风格的属性名, 其.NE类型是 DateTime的。 |
(3) |
access (可选 - 默认是 property): NHibernate用于访问属性值的策略。 |
(4) |
unsaved-value (可选 - 默认是null): 用于标明某个实例时刚刚被实例化的(尚未保存)版本属性值, 依靠这个值就可以把这种情况和 已经在先前的session中保存或装载的脱管(detached)实例区分开来。 (undefined 指明使用标识属性值进行这种判断。) |
(5) |
generated : 指出时间戳值是否实际上是由数据库生成的.请参阅5.5 “数据库生成属性(Generated Properties)”的讨论。 |
注意<timestamp>等价于<version type="timestamp">。
九、property
<property>元素为类定义了一个持久化类的属性。
<propertyname="propertyName" (1)column="column_name" (2)type="typename" (3)update="true|false" (4)insert="true|false" (4)formula="arbitrary SQL expression" (5)access="field|property|ClassName" (6)optimistic-lock="true|false" (7)generated="never|insert|always" (8) />
说明:
(1) |
name: 属性的名字。 |
(2) |
column (可选 - 默认为属性名字): 对应的数据库字段名。 |
(3) |
type (可选): 一个NHibernate类型的名字。 |
(4) |
update, insert (可选 - 默认为 true) : 表明用于UPDATE 和/或 INSERT 的SQL语句中是否包含这个被映射了的字段。 这二者如果都设置为false 则表明这是一个“外源性(derived)”的属性, 它的值来源于映射到同一个(或多个) 字段的某些其他属性,或者通过一个trigger(触发器)或其他程序生成。 |
(5) |
formula (可选): 一个SQL表达式,定义了这个计算 (computed) 属性的值。计算属性没有和它对应的数据库字段。 |
(6) |
access (可选 - 默认值为 property): NHibernate用来访问属性值的策略。 |
(7) |
optimistic-lock (可选 - 默认为 true): 指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。 |
(8) |
generated (可选 - 默认为 never): 表明此属性值是否实际上是由数据库生成的。 请参阅5.5 “数据库生成属性(Generated Properties)”的讨论。 |
typename可以是如下几种
NHibernate基本类型名(比如:Int32, String, Char, DateTime, Timestamp, Single, Byte[], Object, ...)。
一个.Net类的名字,这个类属于一种默认基础类型 (比如: System.Int16, System.Single, System.Char, System.String, System.DateTime, System.Byte[], ...)。
一个枚举类型的名字。(比如:. eg.Color)。
一个可以序列化的.NET类的名字。
一个自定义类型的类的名字。(比如: Illflow.Type.MyCustomType)。
注意你必须为所有类型(除了NHibernate基础类型)指定完整的应用程序集权限定名 (或者是在<hibernate-mapping>里面配置了assembly和namespace属性)。
NHibernate支持.NET 2.0的可空类型,这些类型和对应的非可空类型处理方式是一致的, 例如:Nullable<Int32>可以对应type="Int32"或者是type="System.Int32"。
如果你没有指定类型,NHibernate会使用反射来得到这个名字的属性, 以此来猜测正确的NHibernate类型。NHibernate会对属性读取器(getter方法)的返回类进行解释, 按照规则2,3,4的顺序。然而,这并不足够。 在某些情况下你仍然需要type属性。 (比如,为了区别NHibernateUtil.DateTime和NHibernateUtil.Timestamp,或者为了指定一个自定义类型。)
access属性用来让你控制NHibernate如何在运行时访问属性。 在默认情况下, NHibernate会按照access-strategy.naming-strategy来格式化属性名 .naming-strategy不是必填项。
表 5.1. 访问策略
访问策略名 | 描述 |
---|---|
property |
默认实现:NHibernate访问类的set/get属性,这种方式没有命名策略,因为name就代表属性的名称。 |
field |
NHibernate将会直接访问成员变量。NHibernate使用name作为成员变量的名称。 当对象属性的get和set里面有额外的操作,而你不想让NHibernate设置或者读取对象时执行额外的操作, 可以用这个策略。当你使用HQL时需要属性名而非字段时,就需要命名策略(Naming Strateg)。 |
nosetter |
NHibernate将会在设置值时直接访问字段,获得值时访问属性。 当API使用者不能直接改变值,因而只为属性只提供了get访问器时, 你可以用这个策略。NHibernate使用name属性(attribute)作为属性(Property ), 并且需要提供字段名,所以命名策略必须(Naming Strategy)使用。 |
ClassName |
如果NHibernate内置的访问策略(Access Strategie)不能满足你的要求。 你可以通过实现NHibernate.Property.IPropertyAccessor接口来自己的访问策略(Access Strategie)。 这个值需要用程序集名(Assembly)来限定,这样就能通过 Activator.CreateInstance(string AssemblyQualifiedName)来读取。 |
命名策略(Naming Strategy)
命名策略 | 描述 |
---|---|
camelcase |
name属性被转换CamelCase格式来查找字段。<property name="Foo" ... >使用foo字段。 |
camelcase-underscore |
name属性被转换CamelCase格式并添加下划线前缀来查找字段。<property name="Foo" ... >使用_foo字段。 |
lowercase |
name属性被转换小写格式来查找字段。<property name="FooBar" ... > 使用 foobar字段. |
lowercase-underscore |
name属性被转换小写格式并添加下划线前缀来查找字段。<property name="FooBar" ... >使用_foobar字段. |
pascalcase-underscore |
name属性添加下划线前缀来查找字段。<property name="Foo" ... >使用_Foo字段。 |
pascalcase-m |
name属性添加字母m前缀来查找字段。<property name="Foo" ... >使用mFoo字段。 |
pascalcase-m-underscore |
name属性添加字母m和下划线前缀来查找字段。<property name="Foo" ... > 使用m_Foo字段。 |
十、多对一(many-to-one)
<many-to-onename="PropertyName" (1)column="column_name" (2)class="ClassName" (3)cascade="all|none|save-update|delete" (4)fetch="join|select" (5)update="true|false" (6)insert="true|false" (6)property-ref="PropertyNameFromAssociatedClass" (7)access="field|property|nosetter|ClassName" (8)unique="true|false" (9)optimistic-lock="true|false" (10)not-found="ignore|exception" (11) />
说明:
(1) |
name:属性名。 |
(2) |
column数据库字段名 |
(3) |
class(可选 - 默认是通过反射得到属性类型): 关联的类的名字。 |
(4) |
cascade(级联) (可选): 指明哪些操作会从父对象级联到关联的对象。 |
(5) |
fetch (可选 - 默认为 select): 在外连接抓取(outer-join fetching)和序列选择抓取(sequential select fetching)两者中选择其一。 |
(6) |
(可选 - defaults to true) 指定对应的字段是否包含在用于UPDATE 和/或 INSERT 的SQL语句中。如果二者都是false,则这是一个纯粹的 “外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到 或者通过trigger(触发器)、或其他程序。 |
(7) |
property-ref: (可选) 指定关联类的一个属性,这个属性将会和本外键相对应。 如果没有指定,会使用对方关联类的主键。 |
(8) |
access(可选 - 默认是 property): NHibernate用来访问属性的策略。 |
(9) |
unique (可选): 使用DDL为外键字段生成一个唯一约束。此外, 这也可以用作property-ref的目标属性。这使关联同时具有 一对一的效果。 |
(10) |
optimistic-lock (可选 - 默认为 true): 指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。 |
(11) |
not-found (可选 - 默认为 exception): 指定外键引用的数据不存在时如何处理: ignore会将数据不存在作为关联到一个空对象(null)处理。 |
cascade属性允许下列值:: all, save-update, delete, none. 设置除了none以外的其它值会传播特定的操作到关联的(子)对象中。参见后面的“Lifecycle Objects(自动管理生命周期的对象)”。
fetch参数允许下列两个不同值:
join外连接抓取
select使用隔离查询抓取
一个典型的简单many-to-one 定义例子:
<many-to-one name="product" class="Product" column="PRODUCT_ID"/>
<property name="serialNumber" unique="true" type="string" column="SERIAL_NUMBER"/>
<many-to-one name="product" property-ref="serialNumber" column="PRODUCT_SERIAL_NUMBER"/>
十一、一对一
<one-to-onename="PropertyName" (1)class="ClassName" (2)cascade="all|none|save-update|delete" (3)constrained="true|false" (4)fetch="join|select" (5)property-ref="PropertyNameFromAssociatedClass" (6)access="field|property|nosetter|ClassName" (7) />
说明:
(1) |
name: 属性的名字。 |
(2) |
class (可选 - 默认是通过反射得到的属性类型):被关联的类的名字。 |
(3) |
cascade(级联) (可选) 表明操作是否从父对象级联到被关联的对象。 |
(4) |
constrained(约束) (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。 这个选项影响Save()和Delete()在级联执行时的先后顺序以及 决定该关联能否被委托(也在schema export tool中被使用). |
(5) |
fetch (可选 - 默认设置为select): 在外连接抓取或者序列选择抓取选择其一. |
(6) |
property-ref: (可选) 指定关联类的属性名,这个属性将会和本类的主键相对应。如果没有指定,会使用对方关联类的主键。 |
(7) |
access (可选 - 默认是 property): NHibernate用来访问属性的策略。 |
有两种不同的一对一关联:
主键关联
惟一外键关联
主键关联不需要额外的表字段;如果两行是通过这种一对一关系相关联的,那么这两行就共享同样的主关键字值。所以如果你希望两个对象通过主键一对一关联,你必须确认它们被赋予同样的标识值!
比如说,对下面的Employee和Person进行主键一对一关联:
<one-to-one name="Person" class="Person"/> <one-to-one name="Employee" class="Employee" constrained="true"/>
现在我们必须确保PERSON和EMPLOYEE中相关的字段是相等的。我们使用一个被成为foreign的特殊的现在我们必须确保PERSON和EMPLOYEE中相关的字段是相等的。我们使用一个被成为foreign的特殊的hibernate标识符生成策略:标识符生成策略: foreign:
<class name="Person" table="PERSON"><id name="Id" column="PERSON_ID"><generator class="foreign"><param name="property">Employee</param></generator></id>...<one-to-one name="Employee"class="Employee"constrained="true"/> </class>
一个刚刚保存的Person实例被赋予和该Person的employee属性所指向的Employee实例同样的关键字值。
另一种方式是一个外键和一个惟一关键字对应,上面的Employee和Person的例子,如果使用这种关联方式,可以表达成:
<many-to-one name="Person" class="Person" column="PERSON_ID" unique="true"/>
如果在Person的映射加入下面几句,这种关联就是双向的:
<one-to-one name="Employee" class="Employee" property-ref="Person"/>
NHibernate之映射文件配置说明(转载2)相关推荐
- NHibernate之映射文件配置说明(转载1)
源博客:http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 1. hibernate-mapping 这个元素包括以下可选 ...
- NHibernate之映射文件配置说明
1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为 ...
- 快速生成NHibernate的映射文件和映射类的利器 —— codesmith软件
1. Codesmith软件简介 (1) Codesmith软件是一种基于模板的代码生成工具,在ORM中,它能帮助我们生成实体类.XML配置文件,从而简化了我们一部分的开发工作,它的使用类似于 ...
- Angular应用中tsconfig.json文件配置说明及配置全局路径映射
tsconfig.json文件配置说明 1. tsconfig.json文件中的选项配置 2. 配置全局路径映射 1. tsconfig.json文件中的选项配置 TypeScript编译器配置文件的 ...
- NHibernate Step by Step (一) 转载
转载于http://abluedog.cnblogs.com/archive/2006/04/15/375862.html 基本的软件环境如下: 1.NHibernate http://www.nhi ...
- Fluent NHibernate关系映射
1.好处:Fluent NHibernate让你不再需要去写NHibernate的标准映射文件(.hbm.xml), 方便了我们的代码重构,提供了代码的易读性,并精简了项目代码 实现: (1).首先我 ...
- MyBatsi-Mapper映射文件
Mapper映射文件 cache – 给定命名空间的缓存配置. cache-ref – 其他命名空间缓存配置的引用. resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加 ...
- 使用内存映射文件在进程之间共享数据
数据共享方法是通过让两个或多个进程映射同一个文件映射对象的视图来实现的,这意味着它们将共享物理存储器的同一个页面.因此,当一个进程将数据写入一个共享文件映射对象的视图时,其他进程可以立即看到它们视图中 ...
- MongoDB内存映射文件
2019独角兽企业重金招聘Python工程师标准>>> Mongodb源码分析--内存文件映射(MMAP) 内存映射文件原理探索 Linux 内存映射函数 mmap()函数详解 Li ...
最新文章
- 2021年大数据常用语言Scala(二十六):函数式编程 分组 groupBy
- 工业根基,莫让ICT喧宾夺主
- sql ntext 替换存储过程
- NLP之路-python爬虫
- 《学习之道》第十章方法空间能力是可以后天形成的
- PHP常用函数之字符串处理
- Logic Pro for Mac(音频制作软件)V10.6.2中文版 支持M1芯片版mac
- 常见的Java基础的面试题
- 树莓派端口i2s_树莓派制造低成本交互式显微镜
- Python 字典与集合
- 数据结构:图(基础概念及操作,图文解释)
- 资深项目经理推荐的几款免费/开源项目管理工具
- 如何将markdown文件转成word
- Ubuntu Server 22.04 Jammy Jellyfish安装Budgie桌面环境
- 20155210 2016-2017-2 《Java程序设计》第7周学习总结
- 雪糕效应与互联网营销
- onnx 模型推理示例-Python 实现 |【onnx 模型推理】
- 如何更改计算机睿频,设置睿频加速功能在win7中实现加速的步骤
- 制作chm文件搜索时总提示找不到主题的问题
- 微信代驾小程序-景德镇代驾服务平台小程序源码分享
热门文章
- php 面向对象开发 类的学习 一
- gcc:undefined reference to 'std::cout'
- 网络拓扑系列 - 网络拓扑的“管理”元素
- 2008年5月网络管理员考试上午试卷参考答案
- Microsoft Teams Voice语音落地系列-5 实战: Sonus语音网关配置
- 启动LINUX系统后,进入图形化界面的命令
- 《I'm a Mac:雄狮训练手册》——第1章 开机 1.1 “咚”声的作用
- ArcGIS JS 学习笔记4 实现地图联动
- android 开发 获取各种intent (图片、apk文件、excel、pdf等文件)
- 大专生如何报考MBA