博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nhibernate3循序渐进(二): 基本映射和复合主键
阅读量:6237 次
发布时间:2019-06-22

本文共 3152 字,大约阅读时间需要 10 分钟。

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>标签定义一个持久化类

  

  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 { 
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;
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; }
    }
}

 

运行效果:

 

 

 

 

 

 

 

转载地址:http://bizia.baihongyu.com/

你可能感兴趣的文章
C# 6.0新特性
查看>>
MySQL数据库的几种常见高可用方案
查看>>
java数组复制的几种常见用法
查看>>
去哪网实习总结:JavaWeb中文传參乱码问题的解决(JavaWeb)
查看>>
Xeon Phi之MIC编程知识点
查看>>
jigloo安装和介绍
查看>>
php monolog 的写日志到unix domain socket 测试终于成功
查看>>
【转】JSP中的9大隐藏对象
查看>>
荆慕瑶
查看>>
bilibili携手WeTest,保障视频类应用优质适配体验
查看>>
无线应用安全剖析
查看>>
GNU/Linux安全基线与加固-0.1
查看>>
当产品/后端/QA/你自己说了这些话,就要警惕了!
查看>>
聊聊directory traversal attack
查看>>
OC消息转发机制
查看>>
理解函数防抖Debounce
查看>>
10分钟了解react引入的hooks
查看>>
用一个简易的 web chat 说说 Python、Golang、Nodejs 的异步
查看>>
Nginx代理访问提示ERR_CONTENT_LENGTH_MISMATCH
查看>>
【iOS开发】在Xcode中做一个 a包合成脚本
查看>>