NHibernate的联合主键配置比较复杂,初次配置可能需要花些时间,但只要我们理解了,掌握一定的步骤还是很容易的。
下面以一个实例进行一下演示:
您可以先下载Demo比对阅读:Demo源代码下载
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; }
}//
}//
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; }
}
}
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();
}
}
}
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>
<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>
<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" 注意此处的名称