`

O/R Mapping基础(续一)

阅读更多

通过many-to-one元素,可以定义一种常见的与另一个持久化类的关联。这种关系模型是多对一关联。(实际上是一个对象引用。)

<many-to-one
name="propertyName"(1)
column="column_name"(2)
class="ClassName"(3)
cascade="all|none|save-update|delete"(4)
outer-join="true|false|auto"(5)
update="true|false"(6)
insert="true|false"(7)
property-ref="propertyNameFromAssociatedClass" (8)
access="field|property|ClassName"(9)
unique="true|false" (10)
/>
(1)

name: 属性名。

(2)

column (可选):字段名。

(3)

class (可选 - 默认是通过反射得到属性类型): 关联的类的名字。

(4)

cascade (可选): 指明哪些操作会从父对象级联到关联的对象。

(5)

outer-join (可选 - 默认为 auto): 当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取。

(6)

update, insert (可选 - 默认为 true)指定对应的字段是否在用于UPDATE 和/或 INSERT的SQL语句中包含。如果二者都是false,则这是一个纯粹的“外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到的,或者通过trigger(除法器),或者是其他程序。

(8)

property-ref: (可选)指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键。

(9)

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

(10)

unique (可选):允许产生外键列唯一约束的数据库定义语言(DDL)。

cascade属性允许下列值:: all, save-update, delete, none. 设置除了none以外的其它值会传播特定的操作到关联的(子)对象中。参见后面的“Lifecycle Objects(自动管理生命周期的对象)”。

outer-join参数允许下列三个不同值:

  • auto (默认) 使用外连接抓取关联(对象),如果被关联的对象没有代理(proxy)

  • true 一直使用外连接来抓取关联

  • false 永远不使用外连接来抓取关联

一个典型的简单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-one
name="propertyName"(1)
class="ClassName"(2)
cascade="all|none|save-update|delete"(3)
constrained="true|false"(4)
outer-join="true|false|auto"(5)
property-ref="propertyNameFromAssociatedClass" (6)
access="field|property|ClassName"(7)
/>
(1)

name: 属性的名字

(2)

class (可选 - 默认是通过反射得到的属性类型): 被关联的类的名字.

(3)

cascade (可选) 表明操作是否从父对象级联到被关联的对象。

(4)

contstrainted (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。这个选项影响Save()Delete()在级联执行时的先后顺序(也在schema export tool中被使用)。

(5)

outer-join (可选 - 默认为 auto):当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取。

(6)

property-ref: (可选): 指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键。

(7)

access (可选 - defaults to property): NHibernate 用来访问属性的策略。

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

  • 主键关联

  • 惟一外键关联

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

比如说,对下面的EmployeePerson进行主键一对一关联:

<one-to-one name="Person" class="Person" />
<one-to-one name="Employee" class="Employee" constrained="true" />

现在我们必须确保PERSON和EMPLOYEE中相关的字段是相等的。我们使用一个特别的称为foreign的NHibernate标识符生成器策略:

<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实例被赋予和该PersonEmployee属性所指向的Employee实例同样的关键字值。

另一种方式是一个外键和一个惟一关键字对应,上面的EmployeePerson的例子,如果使这种关联方式,应该表达成:

<many-to-one name="Person" class="Person" column="PERSON_ID" unique="true" />

如果在Person的映射加入下面几句,这种关联就是双向的:

<one-to-one name="Employee" class="Employee" property-ref="Person" />

基本的值类型大致可以粗糙的分为三组:System.ValueType类型,System.Object类型和支持大对象的System.Object类型.和.NET类型一样,System.ValueType对应的列不能存储null值,而System.Object可以.

表4.3 System.ValueType 映射类型

NHibernate 类型.NET 类型Database 类型备注
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 -忽略毫秒 在没有指定类型(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 一个 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 - 一个字符,'T' 或者'F'

type="TrueFalse" 必须被指定
YesNo System.Boolean DbType.AnsiStringFixedLength - 一个字符,'Y' 或者'N' type="YesNo"必须被指定

要掌握NHibernate或者使用某种工具生成NHibernate的hbm.xml文件,应该了解这是一个NHibernate类型名的完整的层。type="integer"被映射为Int32NHibernateType,type="short"被映射为Int16NHibernateType.查看所有的转换你可以查看NHibernate.Type.TypeFactory类的静态构造函数.

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

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

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

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

虽然NHibernate内置的丰富类型和对component的支持意味着你可能很少需要使用自定义类型,至少对于你程序中经常出现的自定义类(并非实体)来说,这是一种好方法。比如说,MonetoryAmount(价格总额)对比使用ICompositeUserType来说更好,虽然它可以很容易的使用一个component实现。这样做的动机之一是抽象。通过自定义类型,以后假若你改变表示金额值的方法时,你的映射文件不需要更改,这就得到了保护。

posted on 2006-07-23 15:04 Minwell 阅读(836) 评论(3)  编辑 收藏 网摘 所属分类: Hibernate

评论

恩楼主说的很详细,希望主楼主进一步交流!   

#2楼  2008-01-11 11:11 zjy [未注册用户]

楼主说的很详细,希望主楼主进一步交流!   回复  引用    

#3楼  2008-04-09 00:33 蓝奇高级验证码识别引擎QQ:631753663 [未注册用户]

出售蓝奇高级验证码识别引擎,可准确识别新浪动网淘宝CSDN等多种复杂验证码。

输出为一个标准DLL,可供VB,VC,Delphi,C#.NET,VB.NET,模拟精灵,按键精灵等多平台调用,调用方法简单,几行代码即可完成。独具特色的边缘检测字符分离、旋转倾斜纠正和通用字符匹配算法(无论字体和大小), 使得该引擎对于像新浪、动网、淘宝、CSDN等多种验证码均有不错的识别率,是一款效果较为理想的验证码识别引擎。附详细的调用实例和代码注释等相关技术文档。

通过many-to-one元素,可以定义一种常见的与另一个持久化类的关联。这种关系模型是多对一关联。(实际上是一个对象引用。)

<many-to-one
name="propertyName"(1)
column="column_name"(2)
class="ClassName"(3)
cascade="all|none|save-update|delete"(4)
outer-join="true|false|auto"(5)
update="true|false"(6)
insert="true|false"(7)
property-ref="propertyNameFromAssociatedClass" (8)
access="field|property|ClassName"(9)
unique="true|false" (10)
/>
(1)

name: 属性名。

(2)

column (可选):字段名。

(3)

class (可选 - 默认是通过反射得到属性类型): 关联的类的名字。

(4)

cascade (可选): 指明哪些操作会从父对象级联到关联的对象。

(5)

outer-join (可选 - 默认为 auto): 当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取。

(6)

update, insert (可选 - 默认为 true)指定对应的字段是否在用于UPDATE 和/或 INSERT的SQL语句中包含。如果二者都是false,则这是一个纯粹的“外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到的,或者通过trigger(除法器),或者是其他程序。

(8)

property-ref: (可选)指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键。

(9)

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

(10)

unique (可选):允许产生外键列唯一约束的数据库定义语言(DDL)。

cascade属性允许下列值:: all, save-update, delete, none. 设置除了none以外的其它值会传播特定的操作到关联的(子)对象中。参见后面的“Lifecycle Objects(自动管理生命周期的对象)”。

outer-join参数允许下列三个不同值:

  • auto (默认) 使用外连接抓取关联(对象),如果被关联的对象没有代理(proxy)

  • true 一直使用外连接来抓取关联

  • false 永远不使用外连接来抓取关联

一个典型的简单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-one
name="propertyName"(1)
class="ClassName"(2)
cascade="all|none|save-update|delete"(3)
constrained="true|false"(4)
outer-join="true|false|auto"(5)
property-ref="propertyNameFromAssociatedClass" (6)
access="field|property|ClassName"(7)
/>
(1)

name: 属性的名字

(2)

class (可选 - 默认是通过反射得到的属性类型): 被关联的类的名字.

(3)

cascade (可选) 表明操作是否从父对象级联到被关联的对象。

(4)

contstrainted (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。这个选项影响Save()Delete()在级联执行时的先后顺序(也在schema export tool中被使用)。

(5)

outer-join (可选 - 默认为 auto):当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取。

(6)

property-ref: (可选): 指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键。

(7)

access (可选 - defaults to property): NHibernate 用来访问属性的策略。

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

  • 主键关联

  • 惟一外键关联

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

比如说,对下面的EmployeePerson进行主键一对一关联:

<one-to-one name="Person" class="Person" />
<one-to-one name="Employee" class="Employee" constrained="true" />

现在我们必须确保PERSON和EMPLOYEE中相关的字段是相等的。我们使用一个特别的称为foreign的NHibernate标识符生成器策略:

<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实例被赋予和该PersonEmployee属性所指向的Employee实例同样的关键字值。

另一种方式是一个外键和一个惟一关键字对应,上面的EmployeePerson的例子,如果使这种关联方式,应该表达成:

<many-to-one name="Person" class="Person" column="PERSON_ID" unique="true" />

如果在Person的映射加入下面几句,这种关联就是双向的:

<one-to-one name="Employee" class="Employee" property-ref="Person" />
回复  引用    
评论

相关推荐

    Macrobject NObject O/R Mapping 框架

    NObject O/R Mapping 框架包含了 OQL.NET,一套基于 C# 和 VB.NET 等原生 .NET 语言的强类型对象查询语言 (OQL, Object Query Language) 使您甚至不需要写一行 SQL 语句。 ??NObject O/R Mapping 框架能帮您减少 30...

    O/R_Mapping思想

    O/R_Mapping思想与ADO.NET 基于.NET的Web应用框架的设计与实现 将对象映射到关系数据库——对象/关系映射(O/R_Mapping)详解 面向对象设计中的O/R映射架构

    hibernate如何用O/R Mapping框架来实现我们的数据层

    #### 一、O/R Mapping概述 O/R Mapping(Object-Relational Mapping)即对象关系映射,是一种程序技术,用于将对象模型表示的应用程序对象与关系数据库中的表进行相互转换。在Java开发中,O/R Mapping主要用于处理...

    泛型、反射 实现 O/R mapping 示例

    在Java编程语言中,O/R Mapping(对象关系映射)是一种技术,用于将数据库中的关系数据映射到对象模型上,使得开发人员可以更方便地处理数据,而无需直接操作SQL语句。在这个示例中,我们将探讨如何利用泛型和反射来...

    Hibernate O/R Mapping 入门工程包

    **Hibernate O/R Mapping 入门工程包** 在Java开发领域,Hibernate是一个强大的对象关系映射(Object-Relational Mapping,简称ORM)框架,它能够帮助开发者将数据库操作转化为面向对象的编程,从而降低了数据库和...

    MJDU v6.0 及使用教程(注解+反射+XML+O/R Mapping+R/O Mapping)

    组件出版于 2012 年末横空出世,由于不会炒作,...我才发现原来在 2013 年时上传的 0.04 版本是不带 OR/RO Mapping 机制的。。。 想了想,还是补上 v6 这个带 OR/RO Mapping 机制的版本吧,虽然是同一时期的产物。

    Tornado O/R Mapping Engine-开源

    Tornado O/R Mapping Engine,简称为Tornado/DB,是一款基于Java平台的对象关系映射(Object-Relational Mapping,ORM)工具。ORM技术的主要目标是通过将数据库中的数据与应用程序中的对象进行映射,从而简化数据库...

    o-x-mapping测试

    "o-x-mapping"通常指的是对象到XML的映射,它允许我们将Java对象转换为XML文档,或者从XML文档中反向创建Java对象。这种映射机制是许多框架和库的核心功能,如JAXB(Java Architecture for XML Binding)和XStream等...

    一個好好的 hibernate 介紹

    - **简介**:Hibernate 是一种流行的 O/R Mapping 工具,它具有开放源代码的特点,支持免费的 License。由于其轻量级封装和活跃的开发者社区,Hibernate 成为了 Java 应用程序开发中不可或缺的一部分。 - **特性**...

    Mapping Objects to Relational Databases O-R Mapping In Detail.doc

    **O/R Mapping(对象关系映射)详解** 在大多数现代商业应用开发项目中,开发者通常使用Java或C#等面向对象的技术构建应用程序软件,并利用关系型数据库存储数据。虽然也有用过程式语言如COBOL编写的应用,或者使用...

    hibernat培训.ppt

    本讲座主要围绕Hibernate这一强大的对象/关系映射(O/R Mapping)框架展开,旨在帮助学员理解O/R Mapping原理,掌握Hibernate的使用,并能够运用到实际项目开发中。适合熟悉Java、SQL、JDBC,具备面向对象编程经验的...

    O/RM自动生成工具

    2. **O/R Mapping**:对象关系映射,是ORM的核心概念。它通过定义规则将数据库表映射为类,表中的字段映射为类的属性,从而实现对象与数据库记录的对应。这样,开发者可以直接操作对象,而无需关心底层SQL语句的编写...

    Attribute 学习

    Attribute O/R Mapping是一种技术,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句的编写。这种技术大大提高了开发效率,降低了代码的复杂性。 在.NET框架中,Attribute被用作一种元数据,...

    hibernate学习笔记

    一、O/R Mapping简介与优点 1. O/R Mapping(对象关系映射)是为了解决面向对象编程与关系型数据库之间的差异,通过在对象和关系表之间建立关联,使得开发者可以以面向对象的方式处理数据,降低了数据库操作的复杂性...

    HIBERNATE入门

    【HIBERNATE入门】是针对Java开发者的培训资料,主要介绍了如何入门并掌握Hibernate这一流行的O/R Mapping框架。Hibernate是一种用于简化Java应用程序与数据库交互的开源库,它通过对象关系映射(O/R Mapping)技术...

    hibernata 讲解

    一、持久化层——O/R Mapping 对象/关系映射(Object/Relational Mapping,简称O/R Mapping)是解决如何将面向对象的模型与关系数据库之间的转换问题的技术。在Java开发中,O/R Mapping允许程序员以面向对象的方式...

Global site tag (gtag.js) - Google Analytics