Nhibernate3循序渐进(二): 基本映射和复合主键

简介: 1. 基本映射常用标签    作为NHibernate这个ORM框架来说:    一个实体类对应的是数据库中的一张表;    类中的一个属性对应表中的一个字段;    一个对象对应的是表中的一条记录。

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

 

<? xml version="1.0" encoding="utf-8"  ?>

< 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;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NHibernate3.Domain
{
     public  class ProductID
    {
         public  virtual  string Name {  getset; }

         public  virtual  string QuantityPerUnit {  getset; }

         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;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NHibernate3.Domain
{
     public  class Product
    {
         public  virtual ProductID ID {  getset; }

         public  virtual  string Unit {  getset; }

         public  virtual  decimal SellPrice {  getset; }

         public  virtual  decimal BuyPrice {  getset; }

         public  virtual  string Remark {  getset; }
    }
}

 

运行效果:

 

 

 

 

 

 

 

目录
相关文章
|
4月前
|
Java 关系型数据库 MySQL
JPA中实体类属性相关注解与数据表列映射详解
JPA中实体类属性相关注解与数据表列映射详解
84 0
|
SQL Java 数据库连接
OR-Mapping 设计改进(主键查询改进) | 学习笔记
简介:快速学习 OR-Mapping 设计改进(主键查询改进)
66 0
|
Java 开发者
OR-Mapping 设计改进(主键配置) | 学习笔记
简介:快速学习 OR-Mapping 设计改进(主键配置)
46 0
|
Java 数据库连接
Hibernate的复合主键映射(十五)
Hibernate的复合主键映射(十五)
Hibernate的复合主键映射(十五)
|
Java 数据库连接 关系型数据库
|
算法 Java 关系型数据库
|
XML Java 数据库连接
Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
1:Hibernate的关联关系映射的一对一外键映射:   1.1:第一首先引包,省略   1.2:第二创建实体类:     这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信息的外键,这里先做外键。
975 0
|
Java 数据库连接 数据库
Hibernate多表映射
前面说了Hibernate的单表映射,由于是实体类和数据表之间一对一的映射,所以比较简单。现在就来说说多表映射,这需要涉及到多个实体类和数据表之间的关系。
891 0