300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > NHibernate之映射文件配置说明(转载2)

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

时间:2021-09-24 21:23:19

相关推荐

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

六、鉴别器

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

<discriminatorcolumn="discriminator_column" (1)type="discriminator_type"(2)force="true|false" (3)insert="true|false" (4)formula="arbitrary SQL expression" (5)/>

说明:

鉴别器字段的实际值是根据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)(可选)

<version>元素是可选的,表明表中包含附带版本信息的数据。 这在你准备使用长事务(long transactions)的时候特别有用。

<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)/>

说明:

版本号必须是以下类型:Int64,Int32,Int16,Ticks,或者Timestamp,TimeSpan

八、timestamp (可选)

可选的<timestamp>元素指明了表中包含时间戳数据。 这用来作为版本的替代。 时间戳本质上是一种对乐观锁定的一种不是特别安全的实现。当然, 有时候应用程序可能在其他方面使用时间戳。

<timestampcolumn="timestamp_column" (1)name="PropertyName"(2)access="field|property|nosetter|ClassName" (3)unsaved-value="null|undefined|value" (4)generated="never|always" (5)/>

说明:

注意<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)/>

说明:

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>里面配置了assemblynamespace属性)。

NHibernate支持.NET 2.0的可空类型,这些类型和对应的非可空类型处理方式是一致的, 例如:Nullable<Int32>可以对应type="Int32"或者是type="System.Int32"

如果你没有指定类型,NHibernate会使用反射来得到这个名字的属性, 以此来猜测正确的NHibernate类型。NHibernate会对属性读取器(getter方法)的返回类进行解释, 按照规则2,3,4的顺序。然而,这并不足够。 在某些情况下你仍然需要type属性。 (比如,为了区别NHibernateUtil.DateTimeNHibernateUtil.Timestamp,或者为了指定一个自定义类型。)

access属性用来让你控制NHibernate如何在运行时访问属性。 在默认情况下, NHibernate会按照access-strategy.naming-strategy来格式化属性名.naming-strategy不是必填项。

表5.1.访问策略

命名策略(Naming Strategy)

十、多对一(many-to-one)

通过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)/>

说明:

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-ref属性只应该用来对付老旧的数据库系统, 可能有外键指向对方关联表的是个非主键字段(但是应该是一个惟一关键字)的情况下。 这是一种十分丑陋的关系模型。比如说,假设Product类有一个惟一的序列号, 它并不是主键。(unique属性控制NHibernate通过SchemaExport工具生成DDL的过程。)

<property name="serialNumber" unique="true" type="string" column="SERIAL_NUMBER"/>

那么关于OrderItem的映射可能是:

<many-to-one name="product" property-ref="serialNumber" column="PRODUCT_SERIAL_NUMBER"/>

当然,我们决不鼓励这种用法。

十一、一对一

持久化对象之间一对一的关联关系是通过one-to-one元素定义的。

<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)/>

说明:

有两种不同的一对一关联:

主键关联

惟一外键关联

主键关联不需要额外的表字段;如果两行是通过这种一对一关系相关联的,那么这两行就共享同样的主关键字值。所以如果你希望两个对象通过主键一对一关联,你必须确认它们被赋予同样的标识值!

比如说,对下面的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"/>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。