NHibernate的联合主键配置比较复杂,初次配置可能需要花些时间,但只要我们理解了,掌握一定的步骤还是很容易的。

1、设计数据结构

Users:用户表

名称 Users
说明 用户表
序号 字段名称 数据类型(长度) 允许空 描述 备注说明
1 USER_ID VARCHAR(32)   用户ID PK
2 USER_NAME VARCHAR(50)   用户名  
3 PASSWORD VARCHAR(32)   密码  
4          
5          
主键 USER_ID

UserProfiles:用户Profile表

名称 UserProfiles
说明 用户Profile表
序号 字段名称 数据类型(长度) 允许空 描述 备注说明
1 USER_ID VARCHAR(32)   用户ID PK
2 PROFILE_KEY VARCHAR(50)   Key键值
3 PROFILE_VALUE VARCHAR(10)   Value值  
4          
5          
主键 USER_ID,PROFILE_KEY

2、设计持久化类

UserInfo.cs

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace LXJ.NHibernate.Demo.Model.Auth
{
public class UserInfo
{ public virtual string USER_ID { get; set; }
public virtual string USER_NAME { get; set; }
public virtual string PASSWORD { get; set; } //注意此处:表明UserInfo与UserProfileInfo为 1:n
public virtual IList<UserProfileInfo> UserProfiles { get; set; } }//
}//

UserProfileInfo.cs

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace LXJ.NHibernate.Demo.Model.Auth
{
public class UserProfileInfo
{
//把组合主键(USER_ID,PROFILE_KEY)抽象成一个类UserProfilePKInfo
public virtual UserProfilePKInfo UserProfilePK { get; set; } public virtual string PROFILE_VALUE { get; set; } }
}

UserProfilePKInfo.cs

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace LXJ.NHibernate.Demo.Model.Auth
{
public class UserProfilePKInfo
{
public virtual string USER_ID { get; set; }
public virtual string PROFILE_KEY { get; set; } /// <summary>
/// 判断两个对象是否相同,这个方法需要重写
/// </summary>
/// <param name="obj">进行比较的对象</param>
/// <returns>真true或假false</returns>
public override bool Equals(object obj)
{
if (obj is UserProfilePKInfo)
{
UserProfilePKInfo pk = obj as UserProfilePKInfo;
if (this.USER_ID == pk.USER_ID
&& this.PROFILE_KEY == pk.PROFILE_KEY)
{
return true;
}
else
{
return false;
}
}
return false;
} public override int GetHashCode()
{
return base.GetHashCode();
} }
}

注意:UserProfilePKInfo类必须对Equals和GetHashCode方法进行重写。

3、配置映射文件

UserInfo.hbm.xml

代码

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="LXJ.NHibernate.Demo.Model" namespace="LXJ.NHibernate.Demo.Model.Auth"> <class name="LXJ.NHibernate.Demo.Model.Auth.UserInfo, LXJ.NHibernate.Demo.Model" table="Users"> <id name="USER_ID" column="USER_ID" type="String" length="32">
<generator class="assigned" />
</id>
<property name="USER_NAME" column="USER_NAME" type="String" length="50" not-null ="true"/>
<property name="PASSWORD" column="PASSWORD" type="String" length="32" not-null ="true"/> <bag name="UserProfiles" inverse="true" lazy="true" cascade="all-delete-orphan">
<key column="USER_ID"/>
<one-to-many class="LXJ.NHibernate.Demo.Model.Auth.UserProfileInfo, LXJ.NHibernate.Demo.Model"/>
</bag> </class> </hibernate-mapping>

其中<bag>....</bag>节是配置Users与UserProfiles的一对多映射关系,UserProfiles为类UserInfo中的属性

UserProfileInfo.hbm.xml

代码

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="LXJ.NHibernate.Demo.Model" namespace="LXJ.NHibernate.Demo.Model.Auth"> <class name="LXJ.NHibernate.Demo.Model.Auth.UserProfileInfo, LXJ.NHibernate.Demo.Model" table="UserProfiles"> <composite-id name="UserProfilePK" class="LXJ.NHibernate.Demo.Model.Auth.UserProfilePKInfo, LXJ.NHibernate.Demo.Model">
<key-property name="USER_ID" column="USER_ID" type="String" length="32" />
<key-property name="PROFILE_KEY" column="PROFILE_KEY" type="String" length="50" />
</composite-id> <property name="PROFILE_VALUE" column="PROFILE_VALUE" type="String" length="100" not-null ="true"/>
</class> </hibernate-mapping>
 

注意:

  • <composite-id> .... </composite-id>配置节依赖于类UserProfilePKInfo
  • composite-id name="UserProfilePK" 注意此处的名称

NHibernate composite-id联合主键配置的更多相关文章

  1. hibernate 联合主键 composite-id

    如果表使用联合主键(一个表有两个以上的主键),你可以映射类的多个属性为标识符属性.如:<composite-id>元素接受<key-property> 属性映射(单表映射)和& ...

  2. hibernate里联合主键composite-id映射,查询单个主键的问题

    今天项目中遇到这个问题,搞了大半天,现在记录下来hibernate里联合主键配置(多个字段一起作为主键) <class name="com.cskj.hibernate.map.BbW ...

  3. NHibernate 映射基础(第三篇) 简单映射、联合主键

    NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...

  4. NHibernate联合主键详细示例

    使用NHibernate实现一对多,多对一的关联很是简单,可如果要用复合主键实现确实让人有些淡淡的疼.虽然很淡疼但还是要去抹平这个坑,在下不才,愿意尝试. 以示例进入正文,源码下载地址: 一.数据表关 ...

  5. hibernate 联合主键生成机制(组合主键XML配置方式)

    hibernate 联合主键生成机制(组合主键XML配置方式)   如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体 ...

  6. sql,联合主键,按id分组求版本号最大值的集合

    表结构如下: /* SQLyog v10.2 MySQL - 5.5.39 ************************************************************** ...

  7. Hibernate xml配置方法之联合主键

    1.StudentPK类,存放Student的联合主键,必须实现java.io.Serializable接口(为了序列化扩充移植),必须重写equals跟hashCode方法(为了确保唯一性) pub ...

  8. Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/A ...

  9. 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)

    参考了多篇文章,分别记录,如下. 下面是第一篇的总结 http://www.jb51.net/article/76007.htm: 在MySQL中,InnoDB引擎表是(聚集)索引组织表(cluste ...

随机推荐

  1. android入门——UI(4)

    GridView控件实现菜单 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml ...

  2. MATLAB中return和break

    return: RETURN Return to invoking function. RETURN causes a return to the invoking function or to th ...

  3. 【转】CoreData以及MagicalRecord (一)

    先粗略的了解下CoreData中的一些核心概念 1. CoreData 的核心概念 先上两幅关键的概念图 (1)NSManagedObjectModel 托管对象模型(MOM)是描述应用程序的数据模型 ...

  4. [MAC Eclipse] Eclipse for MAC 中文乱码的解决办法

    笔者将在windows下的eclipse写的代码拷贝到MAC下,发现中文会出现乱码. 最初笔者遇到这个问题的时候,在网络上寻找了解决办法,出来的第一个网页(http://blog.csdn.net/w ...

  5. BZOJ 2302: [HAOI2011]Problem c( dp )

    dp(i, j)表示从i~N中为j个人选定的方案数, 状态转移就考虑选多少人为i编号, 然后从i+1的方案数算过来就可以了. 时间复杂度O(TN^2) ------------------------ ...

  6. 《Effective C++》Item2:尽量以const,enum,inline替换#define

    1. 宏定义 #define ASPECT_RATIO 1.653 该宏定义ASPECT_RATIO也许从来没有被编译器看到,也许在编译器开始处理源码之前就已经被预处理器替换了.所以记号名称ASPEC ...

  7. Android 一个抽奖应用的逆向破解全流程之加固自己应用

    转自: <a href="http://www.pedant.cn/2014/07/22/crack-a-draw-app/">http://www.pedant.cn ...

  8. BOM 浏览器对象模型学习

    window对象属性 innerWidth/innerHeight 浏览器窗口的内部宽度与高度 outerWidth/outerHeight 浏览器的外部宽度与高度 length window.fra ...

  9. break在switch中的使用例子

    /* Name:break在switch中的使用例子 Copyright: By.不懂网络 Author: Yangbin Date:2014年2月21日 03:16:52 Description:以 ...

  10. Oracle 游标Cursor 的基本用法

    查询 SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT语句时,要与INTO子句一起使用,查询的 返回值被赋予INTO子句中的变量,变量的声明是在DELCARE中.SELECT ...