1. 基本映射常用标签
作为NHibernate这个ORM框架来说:
一个实体类对应的是数据库中的一张表;
类中的一个属性对应表中的一个字段;
一个对象对应的是表中的一条记录。
1.1 hibernate-mapping
<hibernate-mapping>标签是NHibernate映射文件的根节点。
<hibernate-mapping
schema="schemaName" 数据库schema名称。
default-cascade="none|save-update" 默认的级联风格,(可选 - 默认为 none):。
auto-import="true|false" 指定我们在使用查询语句的时候是否可以使用非全限定名。
assembly="AssemblyName"
namespace="Namespace" 指定映射文件中的类的应用程序集名称和其所在的名称空间名,
用来生成类的非全限定名。
/>
1.2 class
<class>标签定义一个持久化类
<class
name="ClassName" 持久化类的类名,这里可以是类的全名。
table="tableName" 对应的数据库表名。
discriminator-value="discriminator_value" 辨别值,一个用于区分不同的子类的值,在多态行为时使用(在后面继承映射的课程中会讲到)。
mutable="true|false" 表明该类的实例可变。
schema="owner" 覆盖在根元素中指定的schema名字。
proxy="ProxyInterface" 指定一个接口,在延迟装载时作为代理使用。你可以在这里使用该类自己的名字。
dynamic-update="true|false" 指定用于UPDATE 的SQL将会在运行时动态生成,并且只更新那些改变过的字段。
dynamic-insert="true|false" 指定用于 INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值字段。
select-before-update="true|false" 指定NHibernate除非确定对象的确被修改了,UPDATE操作。
polymorphism="implicit|explicit" 界定是隐式还是显式的使用查询多态。
where="arbitrary sql where condition" 指定一个附加的SQL WHERE 条件,在抓取这个类的对象时会一直增加这个条件。
persister="PersisterClass" 指定一个定制的 IClassPersister。
batch-size="N" 指定一个用于根据标识符抓取实例时使用的"batch size"(批次抓取数量),默认值为1。
optimistic-lock="none|version|dirty|all" 乐观锁定,决定乐观锁定的策略。
lazy="true|false" 是否启用延迟加载。
abstract="true|false" 是否为抽象类。
/>
1.3 id
<id>标签定义了该属性到数据库表主键字段的映射。
<id
name="PropertyName" 标识属性的名字。
type="typename" NHibernate类型的名字
column="column_name" 主键字段的名字。
unsaved-value="any|none|null|id_value" 一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。
access="field|property|nosetter|ClassName" NHibernate用来访问属性值的策略。
<generator class="generatorClass"/>
</id>
generator:主键生成策略
NHibernate提供了以下几种生成策略:
2. 复合主键
2.1 composite-id
<composite-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>
注意的是,若使用联合主键,你的持久化类必须重载 Equals()和GetHashCode()方法
代码如下:
Product.hbm.xml
< hibernate-mapping xmlns ="urn:nhibernate-mapping-2.2" assembly ="NHibernate3.Domain" namespace ="NHibernate3.Domain" >
< class name ="Product" table ="T_Product2" lazy ="true" >
< composite-id name ="ID" class ="ProductID" >
< key-property name ="Name" type ="string" >
< column name ="Name" length ="50" />
</ key-property >
< key-property name ="QuantityPerUnit" type ="string" >
< column name ="QuantityPerUnit" length ="50" />
</ key-property >
</ composite-id >
< property name ="Unit" type ="string" >
< column name ="Unit" length ="50" />
</ property >
< property name ="SellPrice" type ="decimal" >
< column name ="SellPrice" precision ="14" scale ="2" />
</ property >
< property name ="BuyPrice" type ="decimal" >
< column name ="BuyPrice" precision ="14" scale ="2" />
</ property >
< property name ="Remark" type ="string" >
< column name ="Remark" length ="200" />
</ property >
</ class >
</ hibernate-mapping >
ProductID.cs
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace NHibernate3.Domain
{
public class ProductID
{
public virtual string Name { get; set; }
public virtual string QuantityPerUnit { get; set; }
public override bool Equals( object obj)
{
var entity = obj as ProductID;
if (entity == null)
{
return false;
}
return entity.Name == this.Name
&& entity.QuantityPerUnit == this.QuantityPerUnit;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
}
Product.cs
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace NHibernate3.Domain
{
public class Product
{
public virtual ProductID ID { get; set; }
public virtual string Unit { get; set; }
public virtual decimal SellPrice { get; set; }
public virtual decimal BuyPrice { get; set; }
public virtual string Remark { get; set; }
}
}
运行效果: