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. 交互设计师谈颠覆式创新 | Think different

    作者:Teambition 交互设计师 樊伟 本文由 Teambition 原创.转载请注明出处,附原文链接 题图:by Ed Chao 我们不需要像主流市场的大公司一样做类似相扑的庞大,而是需要像柔 ...

  2. Javascript知识——事件

    O(∩_∩)O~~又是新的一周开始了,今天还是在继续学习Javascript知识,今天主要讲了事件的知识.现在就总结下吧. 事件 事件一般是用于浏览器和用户操作进行交互.最早是 IE 和 Netsca ...

  3. PLSQL连接Oracle数据库,使用instantclient_10_2客户端

    使用instantclient_10_2作为PLSQL客户端配置步骤如下:1.将instantclient_10_2文件夹copy到PLSQL的安装目录下(如D:\Program Files\PLSQ ...

  4. oracle 与sql server 部分内置函数替换

    1,trunc--convert oracle: select trunc(sysdate) from dual   输出:2016/5/24 sql server:select CONVERT(va ...

  5. ASP.NET MVC View向Controller传值方式总结

    1:QueryString传值1)也可以使用new{}来为form的action增加querystring2)在controler里使用Request.QueryString["word&q ...

  6. 【转】在Spring中基于JDBC进行数据访问时怎么控制超时

    http://www.myexception.cn/database/1651797.html 在Spring中基于JDBC进行数据访问时如何控制超时 超时分类 超时根据作用域可做如下层级划分: Tr ...

  7. P - Shopaholic

    P - Shopaholic Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit ...

  8. LINQ to Entity Framework 操作符(转)

    在开始了解LINQ to Entities之前,需要先对.NET Framework 3.5版本后对C#语言的几个扩展特性做一些阐释,这有助于我们更容易.更深刻的理解LINQ to Entities技 ...

  9. PHP查询MYSQL表的主键

    $sql = "SELECT * from Person"; $result = mysql_query($sql,$con); while ($property = mysql_ ...

  10. netty中实现客户端首次连接绑定并非每次read检查的方法

    需求场景 客户端第一次连接时,将客户端存起来 重写 ChannelHandlerAdapter 的 handlerAdded 方法