NHibernate composite-id联合主键配置
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联合主键配置的更多相关文章
- hibernate 联合主键 composite-id
如果表使用联合主键(一个表有两个以上的主键),你可以映射类的多个属性为标识符属性.如:<composite-id>元素接受<key-property> 属性映射(单表映射)和& ...
- hibernate里联合主键composite-id映射,查询单个主键的问题
今天项目中遇到这个问题,搞了大半天,现在记录下来hibernate里联合主键配置(多个字段一起作为主键) <class name="com.cskj.hibernate.map.BbW ...
- NHibernate 映射基础(第三篇) 简单映射、联合主键
NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...
- NHibernate联合主键详细示例
使用NHibernate实现一对多,多对一的关联很是简单,可如果要用复合主键实现确实让人有些淡淡的疼.虽然很淡疼但还是要去抹平这个坑,在下不才,愿意尝试. 以示例进入正文,源码下载地址: 一.数据表关 ...
- hibernate 联合主键生成机制(组合主键XML配置方式)
hibernate 联合主键生成机制(组合主键XML配置方式) 如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体 ...
- sql,联合主键,按id分组求版本号最大值的集合
表结构如下: /* SQLyog v10.2 MySQL - 5.5.39 ************************************************************** ...
- Hibernate xml配置方法之联合主键
1.StudentPK类,存放Student的联合主键,必须实现java.io.Serializable接口(为了序列化扩充移植),必须重写equals跟hashCode方法(为了确保唯一性) pub ...
- Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/A ...
- 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)
参考了多篇文章,分别记录,如下. 下面是第一篇的总结 http://www.jb51.net/article/76007.htm: 在MySQL中,InnoDB引擎表是(聚集)索引组织表(cluste ...
随机推荐
- 交互设计师谈颠覆式创新 | Think different
作者:Teambition 交互设计师 樊伟 本文由 Teambition 原创.转载请注明出处,附原文链接 题图:by Ed Chao 我们不需要像主流市场的大公司一样做类似相扑的庞大,而是需要像柔 ...
- Javascript知识——事件
O(∩_∩)O~~又是新的一周开始了,今天还是在继续学习Javascript知识,今天主要讲了事件的知识.现在就总结下吧. 事件 事件一般是用于浏览器和用户操作进行交互.最早是 IE 和 Netsca ...
- PLSQL连接Oracle数据库,使用instantclient_10_2客户端
使用instantclient_10_2作为PLSQL客户端配置步骤如下:1.将instantclient_10_2文件夹copy到PLSQL的安装目录下(如D:\Program Files\PLSQ ...
- oracle 与sql server 部分内置函数替换
1,trunc--convert oracle: select trunc(sysdate) from dual 输出:2016/5/24 sql server:select CONVERT(va ...
- ASP.NET MVC View向Controller传值方式总结
1:QueryString传值1)也可以使用new{}来为form的action增加querystring2)在controler里使用Request.QueryString["word&q ...
- 【转】在Spring中基于JDBC进行数据访问时怎么控制超时
http://www.myexception.cn/database/1651797.html 在Spring中基于JDBC进行数据访问时如何控制超时 超时分类 超时根据作用域可做如下层级划分: Tr ...
- P - Shopaholic
P - Shopaholic Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit ...
- LINQ to Entity Framework 操作符(转)
在开始了解LINQ to Entities之前,需要先对.NET Framework 3.5版本后对C#语言的几个扩展特性做一些阐释,这有助于我们更容易.更深刻的理解LINQ to Entities技 ...
- PHP查询MYSQL表的主键
$sql = "SELECT * from Person"; $result = mysql_query($sql,$con); while ($property = mysql_ ...
- netty中实现客户端首次连接绑定并非每次read检查的方法
需求场景 客户端第一次连接时,将客户端存起来 重写 ChannelHandlerAdapter 的 handlerAdded 方法