博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(原创)Nhibernate-对象关系映射的两种方式以及一些注意
阅读量:5086 次
发布时间:2019-06-13

本文共 2421 字,大约阅读时间需要 8 分钟。

       最近一段时间做项目,经理吧权限模块单独提出来,要我开发,熟悉了大概要干的事后,我着手就搭建了一个简单的模块框架。BLL层+Dao层+Model层+UI层。整个项目,采用Nhibernate3.0框架技术实现。

    应为业务功能不是很多,Dao层就负责访问数据库,BLL本来是业务层,但是没有什么复杂业务,所以也就是一些增删改查,然后Model层是参照分析得出的对象关系,这里大家都知道。既然采用Nhibernate,就的利用起来,然后开始建立了对象之间关系的映射,一堆xml文件,后来发现可以在实体里面直接建立映射,这里是利用了Nhibernate.mapping.Attributes的扩展实现,类似于这种:

1         [Property(Name = "AuthorityName", NotNull = true)]2         public virtual string AuthorityName { get; set; } //权限名称3 4         [Bag(0, Table = "AuthorityResourse", Lazy = CollectionLazy.True)]5         [Key(1, Column = "AuthorityId", ForeignKey = "FK_AuthorityResourse_Authority")]6         [Index(2, Column = "ar_index")]7         [ManyToMany(3, Class = "SEC.Model.Resourse", Column = "ResourseId", ForeignKey = "FK_AuthorityResourse_Resourse")]8         public virtual IList
Resourses { get; set; } //一个权限下操作多个资源

             这里要注意的一点就是,多个特性映射需要加上index位置,否则会有些Bug,比如你电脑没问题,别人用你的文件就会出现一些Bug.实体映射配置好以后,我们可以利用工具反向生成数据库表,这里要提到的是,如果用xml配置方式,我们采用工具生成数据的方式要简单点,应该如下:

View Code
1 //添加引用using Nhibernate.Tool.hbm2ddl;2 3 var nhConfig = new Configuration().Configure();//得到配置文件4 5 var schemaScript = new SchemaExport(nhConfig);6        schemaScript.Drop(false, true);7        schemaScript.Create(false, true);8        schemaScript.SetOutputFile(@"db.sql").Execute(false, false, false);

             而如果采用特性配置的方式,因为配置信息在实体类,我们必须把它加载到输入流当中才能得到实体映射关系,代码应该如下所示:

View Code
1  var nhConfig = new Configuration().Configure(); 2             var serializer = NHibernate.Mapping.Attributes.HbmSerializer.Default; 3             nhConfig.AddInputStream(serializer.Serialize(typeof(SEC.Model.Entity))); 4             nhConfig.AddInputStream(serializer.Serialize(typeof(SEC.Model.User))); 5             nhConfig.AddInputStream(serializer.Serialize(typeof(SEC.Model.Role))); 6             nhConfig.AddInputStream(serializer.Serialize(typeof(SEC.Model.Group))); 7             nhConfig.AddInputStream(serializer.Serialize(typeof(SEC.Model.Resourse))); 8             nhConfig.AddInputStream(serializer.Serialize(typeof(SEC.Model.Authority))); 9             var schemaScript = new SchemaExport(nhConfig);10             schemaScript.Drop(false, true);11             schemaScript.Create(false, true);12             schemaScript.SetOutputFile(@"db.sql").Execute(false, false, false);

             这样我们就能正确生成我们的数据库。Dao层我们利用Nhibernate提供的session和事务机制完成对数据库的访问,UI层采用MVC2框架技术,最后顺利的完成了模块开发。

转载于:https://www.cnblogs.com/apsnet/archive/2012/07/05/2578555.html

你可能感兴趣的文章
xml bug
查看>>
可以嵌入程序的chrome
查看>>
开源的截图工具
查看>>
Eclipse4.7安装SWT
查看>>
POJ 1840 Eqs(哈希表)
查看>>
算法题目
查看>>
20170728 Celery项目 后台处理SQL SERVER的一个异常
查看>>
SSM框架整合
查看>>
PAT 1001-1010 题解
查看>>
创龙TMS320C6748开发板串口和中断学习笔记
查看>>
01 C语言程序设计--01 C语言基础--第3章 基本数据类型01
查看>>
Java 反射机制详解(上)
查看>>
oracle drop table(表)数据恢复方法
查看>>
编译LAMP部署动态网站环境
查看>>
Java 8 新的时间日期 API
查看>>
PHP基本语法
查看>>
Linux命令应用大词典-第8章 日期和时间
查看>>
jenkins+maven+svn构建项目,及远程部署war包到tomcat上
查看>>
图解CSS3之弹性盒模型篇(display:box / display:inline-box)
查看>>
【iOS】UIImageView 点击事件
查看>>