Basic O/R Mapping
对象和关系的映射被定义在XML文件里。这个XML文件被设计成易读易修改。这个映射语言是被定义为以对象为中心的而不是以表为中心的,这叫意味着负我们必须提供可持久化的类。
正因为如果,许多NHibernate用户选择手工书写XML映射文件,其实有许多工具可以自动生成XML映射文件的,包括NHibernate.Mapping.Attributes library和许多支持模板级的生成工具(CodeSmith, MyGeneration)。
让我们以一个简单的映射文件开始:
<?xml version="1.0"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Eg" namespace="Eg"> <class name="Cat" table="CATS" discriminator-value="C"//这不知道啥意思> <id name="Id" column="uid" type="Int64"> <generator class="hilo"//好像是主键生成策略的一种/> </id> <discriminator column="subclass" type="Char"//这也不知道啥意思/> <property name="BirthDate" type="Date"/> <property name="Color" not-null="true"/> <property name="Sex" not-null="true" update="false"/> <property name="Weight"/> <many-to-one name="Mate" column="mate_id"/>一对多关系 <set name="Kittens">对应的多 <key column="mother_id"/> <one-to-many class="Cat"/>对应的父 </set> <subclass name="DomesticCat" discriminator-value="D">派生类吧 <property name="Name" type="String"/> </subclass> </class> <class name="Dog"> <!-- mapping for Dog could go here --> </class> </hibernate-mapping>
晕,不懂的地方还真多,没事回家问问老婆,说来惭愧,还没老婆强呐。。
我们将论述上面的XML文件的内容。我们将只论述Nhibernate在运行时用的到的文档的元素,
这个映射文件也包含其它属性和元素,他们能影响数据库的性质(如 not-null属性)。
1.XML NameSpace
所有的XML文档必须有指点的XML NameSpace。目前的样式可以在
src\nhibernate-mapping-2.2.xsd里找到。
提示:想使IntelliSense 能映射和配置文件,拷贝合适的.xsd文件到
<VS.NET installation directory>\Common7\Packages\schemas\xml里。
2. hibernate-mapping
这个元素有许多可选的属性。The schema attribute specifies that tables referred to by this mapping belong to the named schema。(schema属性指点表用我们指点的Schema)如果指点,表的命名将被要求按指点的Schema。如果没有指点,表名将没有限制。default-cascade属性指点当没有指点一个Cascade时,属性和集合将有什么样的默认值。auto-import属性的默认值,使我们在查询语句里能用任何的名称。Assembly和namespace指点持久化类的命名空间和程序集名称。
<hibernate-mapping
schema="schemaName" (1)
default-cascade="none|save-update" (2)
auto-import="true|false" (3)
assembly="Eg" (4)
namespace="Eg" (5)
/>
(1) schema(可选):数据库Schema的名称。(不明白啥意思Ing。。)
(2) default-cascade(可选-默认值是None)。不名称啥意思。
(3) auto-import(可选-默认值是True)不明白。Specifies whether we can use unqualified class names (of classes in this mapping) in the query language.(指点我们在查询时怎么用类的名称,还不是很明白。)
(4) assembly and namespace(可选):为映射文件的类指点程序集和命名空间。
如果你没有指点Assembly和NameSpace那么你就要为指定全称的类名。(包括程序集和命名空间,这样Nhibernate才能找到要映射的类。)
如果你有二个类的名称一样,那么你一定要设置auto-import为False,这样Nhibernate才不会出错。
3.Class
你可以用Class来声明一个持久化的类。
<class
name="ClassName" (1)
table="tableName" (2)
discriminator-value="discriminator_value" (3)
mutable="true|false" (4)
schema="owner" (5)
proxy="ProxyInterface" (6)
dynamic-update="true|false" (7)
dynamic-insert="true|false" (8)
select-before-update="true|false" (9)
polymorphism="implicit|explicit" (10)
where="arbitrary sql where condition" (11)
persister="PersisterClass" (12)
batch-size="N" (13)
optimistic-lock="none|version|dirty|all" (14)
lazy="true|false" (15)
/>