NHibernate多对多关联映射的实现
上次用EF演示了数据库多对多关系的操作,这次我们还是引用上次的案例,来演示如何在C#当中使用NHibernate。
首先介绍一下NHibernate框架的来源。熟悉Java编程的读者肯定知道Hibernate这个ORM。NHibernate就来源于Java中著名的ORM框架—Hibernate,这点从名称当中就能够知道。目前NHibernate的最新版本是3.3.3,好像有一阵子没有update了,说明当前的版本也比较稳定了。具体的资料可以到官网查询:http://nhforge.org/。
1、下载NHibernate
官网首页就有下载链接,直接下载就可以了。
下载好之后会得到一个zip包。
我们就地解压可以看到如下目录和文件:
我们重点关注以下目录的内容:
Configuration_Templates目录:默认提供的一些配置模板。有支持Oracle、Sql Server、MySQL等等。
Required_Bins目录:这里面存放了我们开发时常用的dll文件。其中的两个xsd文件是能够提供智能提示的文件,我们需要将它们俩复制到你本地的VS的Schemas目录下,比如我的目录为:D:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas 。
复制好之后,重启VS,在我们写Hibernate配置文件时就有了智能提示了。
准备工作做好之后,我们就可以正式演示。
2、创建一个类库项目Model
我们定义好两个类,分别为Student和Subject,为了便于管理,我们将它们放到Entity文件夹里,但命名空间仍为Model。
namespace Model
{
public enum Gender { Female, Male } public class Student
{
public virtual int? StudentId { get; set; }
public virtual string StudentName { get; set; }
public virtual Gender Gender { get; set; }
public virtual DateTime? BirthDay { get; set; } public virtual IList<Subject> Subjects { get; set; }
}
}
namespace Model
{
public class Subject
{
public virtual int? SubjectId { get; set; }
public virtual string SubjectName { get; set; } public virtual IList<Student> Students { get; set; }
}
}
这是一个典型的多对多的应用场景。一个学生可以选修多个课程,一个课程可以被多个学生选修。
接下来我们再创建相应的Hibernate配置文件(就是普通的xml文件,取名为Student.hbm.xml和Subject.hbm.xml)。
Student.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" namespace="Model">
<class name="Student" table="T_Student" lazy="true">
<id name="StudentId" type="int" column="StudentId">
<generator class="native"/>
</id>
<property name="StudentName" type="string" column="StudentName">
<column name="StudentName" length="50"/>
</property>
<property name="Gender" type="Gender" column="Gender">
<column name="Gender" length="4"/>
</property>
<property name="BirthDay" type="datetime" column="BirthDay">
<column name="BirthDay" length="20"/>
</property>
<bag name="Subjects" table="T_Student_Subject">
<key column="StudentId"/>
<many-to-many class="Subject" column="SubjectId"/>
</bag>
</class>
</hibernate-mapping>
Subject.hbm.xml:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" namespace="Model">
<class name="Subject" table="T_Subject" lazy="true">
<id name="SubjectId" type="int" column="SubjectId">
<generator class="native"/>
</id>
<property name="SubjectName" type="string">
<column name="SubjectName" length="50"/>
</property>
<bag name="Students" table="T_Student_Subject">
<key column="SubjectId"/>
<many-to-many class="Student" column="StudentId"/>
</bag>
</class>
</hibernate-mapping>
便于管理我们同样的放到Config目录下(自己创建的文件夹)。
同时修改两个xml文件的生成操作由内容变为嵌入的资源(在vs中右键xml文件选择属性)
3、创建一个控制台应用程序
表和实体对应的内容已经定义好,下面关键的就是要写代码来测试NHibernate了,本着尽量降低学习难度的原则,我这里就用控制台应用程序来验证(你也可以新建一个类库项目,然后用VS的单元测试或者第三方测试工具NUnit进行验证)。
首先将下载的开发包里面的Configuration_Templates文件夹下的MSSQL.cfg.xml复制到控制台应用程序中(为方便管理,我新建了一个Config文件夹,并把这个xml文件放到这里面,重命名为hibernate.cfg.xml)。
修改这个xml文件内容为:
<?xml version="1.0" encoding="utf-8"?>
<!--
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it
for your own use before compile tests in VisualStudio.
-->
<!-- This is the System.Data.dll provider for SQL Server -->
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">
Server=.;database=nhibernateTest;uid=sa;pwd=123456;
</property>
<property name="adonet.batch_size">10</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<mapping assembly="Model"/>
</session-factory>
</hibernate-configuration>
注意这里面的一些节点的配置。比如mapping assembly里面的Model,就是指的是程序集的名称。同时将此文件的复制到输出目录方式修改为始终复制。
接下来,给控制台项目添加两个dll的引用,分别为Iesi.Collections.dll和NHibernate.dll,也是在Required_Bins文件夹里面。
添加好引用,我们创建一个新的类NHibernateTest来写关键性代码。
namespace NHibernateDemo
{
public class NHibernateTest
{
private ISessionFactory _sessionFactory;
public ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
var cfg = new NHibernate.Cfg.Configuration().Configure("Config/hibernate.cfg.xml");
_sessionFactory = cfg.BuildSessionFactory();
}
return _sessionFactory;
}
} public void TestInit()
{
using (ISession session = SessionFactory.OpenSession())
{
IList<Subject> subjects = new List<Subject>()
{
new Subject { SubjectName = "数学" },
new Subject { SubjectName = "英语" },
new Subject { SubjectName = "计算机" },
}; IList<Student> students = new List<Student>()
{
new Student
{
StudentName = "guwei4037",
Gender = Gender.Male,
BirthDay = new DateTime(1984, 11, 25),
Subjects = subjects.Where(x => x.SubjectName == "数学" || x.SubjectName == "计算机").ToArray(),
},
new Student
{
StudentName = "gary.gu",
Gender = Gender.Female,
BirthDay = new DateTime(1987, 9, 15),
Subjects = subjects.Where(x => x.SubjectName == "数学" || x.SubjectName == "英语").ToArray(),
},
}; ITransaction tran = session.BeginTransaction();
try
{
foreach (var subject in subjects)
{
session.Save(subject);
} foreach (var student in students)
{
session.Save(student);
} tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
throw ex;
}
}
}
}
}
这是一个带事务的多表插入的操作。
最后在Main方法中,写入简单的调用方法。
public class program
{
public static void Main(string[] args)
{
NHibernateTest test = new NHibernateTest();
test.TestInit();
}
}
在运行这个程序之前,还要做一件事,就是要在你的Sql Server中新建一个空的数据库nhibernateTest,否则会提示登录失败。
好了,这时我们已经准备好了一切,让我们运行一下这个控制台应用程序吧。
由于我们在hibernate.cfg.xml文件中定义了输入sql,所以会看到窗口中的内容。
好,没有报错。我们打开Sql Server看一下最终的结果。
而且数据库的表、主外键的关联以及数据都为我们自动生成了。
好,双向多对多的关系就演示到这里。如果需要更多详细的信息请参考:http://nhforge.org/doc/nh/en/index.html。
NHibernate多对多关联映射的实现的更多相关文章
- (Hibernate进阶)Hibernate映射——多对多关联映射(八)
多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...
- Hibernate(六)——多对多关联映射
前面几篇文章已经较讲解了三大种关联映射,多对多映射就非常简单了,不过出于对关联映射完整性的考虑,本文还是会简要介绍下多对多关联映射. 1.单向多对多关联映射 情景:一个用户可以有多个角色,比如数据录入 ...
- hibernate之关于使用连接表实现多对一关联映射
[Hibernate]之关于使用连接表实现多对一关联映射 在我们项目使用中採用中间表最多的一般就是多对一,或者是多对多,当然一对一使用中间表也是能够的,可是这样的几率通常少之又少!所以这里重点介绍多对 ...
- 017 多对多关联映射 双向(many-to-many)
多对多关联映射 双向 两方都持有对象引用,修改对象模型,但数据的存储没有变化. 再修改映射文件: public class Role { private int id; private String ...
- 016 多对多关联映射 单向(many-to-many)
一般的设计中,多对多关联映射,需要一个中间表 Hibernate会自动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联 多对多的关联映射,在实体类中,跟一对多一样,也是 ...
- 一口一口吃掉Hibernate(六)——多对多关联映射
今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种. 首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户.这就 ...
- 【SSH系列】Hibernate映射 -- 多对多关联映射
映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...
- hibernate的多对多关联映射
在我们实际项目中,多对多的情况也时长存在,比如最常见的就是系统管理的五张表,如下面的一个结构: 在本文学习hibernate多对多关联映射的实验中我简单的写几个字段,达到学习目的即可. 1.多对多的关 ...
- Hibernate ManyToOne Mappings 多对一关联映射
Hibernate ManyToOne Mappings 多对一关联映射 Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml)2.创建持久化类 ...
随机推荐
- SQL 查询横表变竖表
SQL 查询横表变竖表 /*普通行列转换 假设有张学生成绩表(tb)如下:Name Subject Result张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 ...
- 基于华为Java编程规范的Eclipse checkStyle.xml
发现项目组成员代码规范存在较大的问题,于是就在华为编程规范的基础上制定了这份checkStyle.xml文档,至于Eclipse怎么安装checkStyle插件以及该插件怎么使用请自行Google之. ...
- 使用Unison同步服务器目录
一.Unison简介Unison是Windows.Linux以及其他Unix平台下都可以使用的文件同步工具,它能使两个文件夹(本地或网络上的)保持内容的一致.Unison拥有与其它一些同步工具或文件系 ...
- [React Native + Firebase] React Native: Real time database with Firebase -- setup & CRUD
Install: npm i --save firebase // v3.2.1 Config Firebase: First we need to require Firebase: import ...
- unity3D Socket连接C#server出现unity3D编辑器再次启动连接 unity3D编辑器马上卡死
unity3D Socket与C#server第一次连接时通讯正常.客服端段关闭后.unity3D编辑器再次启动连接 unity3D编辑器马上卡死 原因是Socket处于异步状态,而异步线程是不受Un ...
- 应聘.net开发工程师常见的面试题(四)
1.在Asp.net中所有的自定义用户控件都必须继承自________? 答:Control. 2.在.Net中所有可序列化的类都被标记为_____? 答:[serializable] 3.在.Net ...
- win7如何共享文件 图文教你设置win7文件共享
点评:win7文件共享已成为网友们之间的热议,接下来为大家分享下如何共享文件,首先开启guest账户( 开始菜单 → 运行 → services.msc → 双击 server 服务项 ,设置启动类型 ...
- 快递查询API接口对接方法
各类接口 快递查询API有即时查询和订阅查询两种,即时是请求即返回数据,订阅则是订阅快递单号到接口,有物流轨迹更新则全量返回数据.目前常用的有快递鸟.快递100.快递网等. 快递鸟即时API可以查询3 ...
- java.lang.NoSuchFieldError: RAW_XML_FILE_HEADER,调用XWPFTemplate动态合并生成一个新的docx文档时报错
在使用 org.apache.poi 对office文件 根据表单内容和已上次的附件 动态合并成一个新的文档时,本地调试完全ok 但是发布倒Linux环境上就老是报这个错误java.lang.NoS ...
- Java基础知识强化之IO流笔记69:Properties练习之 判断文件中是否有指定的键,如果有就修改值的案例
1. 我有一个文本文件(user.txt),我知道数据是键值对形式的,但是不知道内容是什么. 请写一个程序判断是否有"lisi"这样的键存在,如果有就改变其值为"100& ...