[转贴]Hello NHibernate

二零一零年,多少个大胡子年轻人在斯德哥尔摩树立了一家做 PaaS
平台的商号,起名为「dotCloud」,那么些名字让自己记念了微软的「DotNet」。

Hello NHibernate

作者:陈省  

 

(一) 天地模型 vs 数据集

在马丁Flower的《集团应用架构方式》一书中关系了公司应用的作业逻辑的协会主要分为以下二种格局:面向进程的业务脚本、面向对象的园地模型以及面向数据集的付出格局。

微软.Net
Framework中提供了多量的数额感知组件使得开发者能够使用RAD的机件飞快支付基于DataSet的集团应用来。开发者只要在界面上摆放一些数量感知组件如DataGrod,设定同数据源的总是,以及对应的表和字段,一个简易的程序就化解了。面向数据集的付出方式万分适合于中型小型型的集团应用程序开发,不过对于复杂的应用程序来说,使用这种开发情势随着业务逻辑复杂度的充实就会日益显得心有余而力不足了。

率先,使用RAD和数据感知组件,就代表数据显现层同数据库表的紧偶合,每使用1个数目感知组件,都也就是将数据的展现视图偶合到了数据库的某部表大概有些字段上,任何对数据模型的更动都会促成对全数绑定到改动的表或字段的数码感知组件的改动。

别的,使用弱类型数据汇总读取数据时,平常是根据字段名来获取字段的目的的值,如DataReader[“Spell”].ToString(),该措施是以字符串来得到多少汇总的字段值,那时编写翻译器是不能增派大家发现那种组件的绑定是或不是全部被考订了,固然使用的字段名称错误了,编写翻译器照旧会以为代码没有不当,那样必要转移的零部件同库表之间的绑定很难被全体发觉,日常会持有遗漏,而由改动引起的错误日常只好是在运作时才能被发现,那就代表要花越多的时辰才能发现错误。而且假使测试时,错误的代码没有被测试所掩盖的话,则错误恐怕要到客户选取时才会被察觉,那时造成的结果可能早已不可能挽回了。而采纳面向对象的天地模型时,对业务域对象的操作都以通过对象的性子大概措施来展开的,如AObj.XXX方法,对指标属性名称或然措施实行了转移的话,编写翻译器会推搡大家找到全部对该目的的不正确的操作,那表示能够更早地发现和化解bug。就算在.Net平德雷斯顿提议了强类型数据集的定义,它能够达成表间关联,编辑校验的数量集属性,从某种程度上弥补了弱类型数据集的瑕疵,不过同完周全向对象的小圈子模型对照,强类型数据集只好促成基本数据类型的天性,并且只可以兑现数据库顶级的属性值约束,比如不能兑现枚举类型的属性。而世界模型则不存在那样的难题。

   
同时,使用数据感知组件,意味着同数据库的故意个性的紧偶合,比如为了减小代码量和提升功能,平日索要运用一些数据库平台相关的出格sql,大概将一部分犬牙交错的sql写成平台相关的蕴藏进度,那样当向差异数据库平台移植时,需求再次编辑多量的作业逻辑。而面向对象的开发情势一般依据面向对象的查询语言,具有一致性,特别容易实现数据库平台毫不相关性,达成系统方便人民群众地搬迁。

   
其余,基于数据集的开销方式难于应用继续、设计形式等面向对象的开发方法,并且数据集对象不能够包括自定义的操作。而世界模型则没有那样的障碍,开发的体系尤其直观和不难明白。

 

(二)面向对象的数据库开发框架NHibernate

 

多年来,更多的人认识到应用面向对象的公司应用开发框架来展开系统的成本具有许多的裨益。在类型设计阶段,使用UML建立模型语言设计业务域对象模型,从模型出发,定义业务域对象,运营时对业务域对象的习性进行操作,直接将业务域对象保存到数据库,或然从数据库加载,消除对面向数据集的Sql的借助,那正是通常所说的ORMapping,对象-关系映射方法。

在Java平台上,O君越Mapping的开源框架的No.1就是Hibernate,Hibernate是一个轻量级的OTiguanMapping化解方案,一经推出就赢得了了不起的功成名就,在刚刚发表的EJB3.0的草案中就收到了大气的Hibernate中的个性。从二〇〇〇年5月初步,SourceForge上公布了.Net版本的NHibernate的Alpha版本,近来NHibernate的开发进展卓殊顺遂,平均每贰个半月就会发表多少个新的本子。

NHibernate具有以下特点:

目的持续性:能够管理.Net类到数量库表的照射,以目的的方式存取数据,协理复杂对象、复合对象,协助对象时期的涉及,比如持续,聚合,关联。O途睿欧Mapping的概念都是遵照XML,具有很好的扩充性和通用性。能够扶助现有的数据库定义,很好地维护用户投资。

帮衬对象查询:提供了面向对象的询问语言(HQL和规则查询),能够依据标准查询复合对象以及对象集合。

协助理工科程师作:创设还非得扶助悲观锁的作业,并提供了乐观锁的面世帮忙。

属性优化:允许用户采用定制的Sql来增加查询的属性,提供了八种SQL自动策略开关,使得框架生成的Sql语句具有十三分优化的性质。提供了灵活的Cache缓冲机制,以及延缓加载,批量更新的策略,保障一般选取的天性不会低于相应的数据集应用。

数据库平台毫无干系性:使用O陆风X8Mapping技术完毕了数据库平台无关性,可以每日切换开发及数据库揭橥平台,方便移植。 

NHibernate的系统布局示意图:

图中的Session对应于应用程序同持久层的2回对话,当中保存有要求的持久化对象的缓存,能够经过标识符查找持久对象。持久层同底层数据库之间的操作是透过ADO.Net来促成的。

(二)Hello NHibernate

   
接下来大家现在开立二个卓殊简单的NHibernate的采纳,它相仿于3个留言簿的效劳,能够将用户输入的音信用保证存到数据库中。

未焚徙薪干活

第叁从SourceForge上下载NHibernate最新版,本文基于NHibernate
0.1.0.0。,将下载的滑坡包解压缩到二个目录下。然后,运转VS.Net
Studio,创制三个Windows应用程序的项目,起名为HelloNHibernate,并丰盛NHibernate.dll,
log4jnet.dll, HashCodeProvider.dll引用(位于NHibernate的Bin子目录下)。

接下去,成立八个在MS Sql
Server两千上创造1个NHibernate的数据库。有了数据库,我们需求写app.config配置文件报告NHibernate到如何地方去找数据库。上边是安顿文件内容:

<?xml version=”1.0″ encoding=”utf-8″ ?>

<configuration>

      <configSections>

             <section name=”nhibernate”
type=”System.Configuration.NameValueSectionHandler, System,
Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089″
/>

      </configSections>

     <nhibernate>

         <add key=”hibernate.show_sql”

              value=”true”

         />

         <add key=”hibernate.connection.provider”         

              value=”NHibernate.Connection.DriverConnectionProvider”

         />

         <add key=”hibernate.dialect”                     

              value=”NHibernate.Dialect.MsSql2000Dialect”

         />

         <add key=”hibernate.connection.driver_class”         

              value=”NHibernate.Driver.SqlClientDriver”

         />

         <add key=”hibernate.connection.connection_string”

              value=” Provider=SQLOLEDB.1;Integrated
Security=SSPI;Persist Security Info=False;Initial
Catalog=NHibernate;Data Source=localhost”

         />

     </nhibernate>

</configuration>

 

布署文件中的参数具有上边包车型大巴意义:

参数

hibernate.show_sql

True表示向控制台输出运行中产生的Sql,用于调试目的

hibernate.connection.provider

表示使用指定的类来提供数据库连接缓冲池。

hibernate.dialect

表示NHibernate方言的类名,可以让NHibernate使用某些特定数据库平台的特性,目前NHibernate支持Sql Server, Oracle, Mysql, Firebird, Sybase, PostgreSql等数据库方言。

hibernate.connection.driver_class

Ado.Net的驱动类,支持SqlServer, Oracle, Mysql,OleDb, ODBC,Firebird等驱动。

hibernate.connection.connection_string

对应于Ado.Net的连接串。

 

业务域模型

基于供给,大家先是来设计业务域模型,模型卓殊不难,唯有多个性情,个中Id唯一标识1个类的实例,也正是类的主键,Text表示用户输入的消息,示意图如下: 

根据业务域模型,创立对应的.Net类的概念,代码如下:

     public class Message
     {

         private int _id; 

         public int Id

         {

              get {  return _id; }

              set { _id = value; }   

         }    

         private string _Text;

 

         public string Text
         {

              get {  return _Text; }

              set { _Text = value; }   

         }    

         public Message()

         {

              //

              // TODO: 在那里添加构造函数逻辑

              //

         }

 

         public override string ToString()

         {

              return _Text;

         }

     } 

Message类除了定义了必备的几个属性外,还重载了基类的ToString方法,那是为了便于在界面中展开始展览示。有了类定义,我们还需求创制存款和储蓄Message对象的数目库表,下边正是同Message对象一一对应的数据库表Messages的DbSchema脚本: 

CREATE TABLE [dbo].[messages] (

     [MsgId] [int] IDENTITY (1, 1) NOT NULL ,

     [Text] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL

) ON [PRIMARY]

GO 

接下去,大家要编写制定O本田UR-V Mapping
映射的配置文件Message.hbm.xml来钦点Message对象同数据库表的照耀关系,下边是成立的炫耀文件内容: 

<?xml version=”1.0″ encoding=”utf-8″ ?>  

<hibernate-mapping xmlns=”urn:nhibernate-mapping-2.0″>

    <class name=”HelloNHibernate.Message, HelloNHibernate”
table=”messages”>

         <id name=”Id” column=”MsgId” type=”Int32″>

              <generator class=”identity” />

         </id>        

         <property name=”Text” type=”String” length=”200″/>

     </class> 

</hibernate-mapping>

 Xml文件中的Class元素的name属性钦点了要拓展览放映射的类的名号为HelloNHibernate.Message,同时这些类需求从HelloNHibernate
assembly中举行加载,
table属性钦赐了Message类在数据库中开始展览坚韧不拔存款和储蓄的库表名称为messages。而Id成分用于注明类标识属性对应于数据库表的主键字段的照射关系,个中name属性标识类的标识属性名称,column属性标识messages表的主键字段的名目,type是标识字段的数据类型,而内嵌的generator成分则指明主键字段唯一值的成形方法,那里identity表示NHibernate使用Sql
Server数据库本人提供的自扩大字段的风味来保管键值唯一。如若我们想本身给Id属性赋值来保险唯一性的话,能够设定class属性为assigned,那样NHibernate将不会自动生成键值。 

概念完文件之后,别忘了在VS.Net
Studio团长Message.hbm.xml的成形操作属性修改为停放的能源。还要注意的是,假设每回大家修改了hbm.xml文件,一定要选用“重新生成”命令来编写翻译项目,不然VS.Net不会再次编写翻译整个项目。 

来得层设计 

来得层的界面设计相当不难,在界面上停放3个ListBox用于体现音讯列表,多少个Text博克斯用于输入音讯,三个Button分别用于查询新闻列表、添加音讯和删除新闻,界面示意图如下:

 

 

完结工作逻辑

 

询问音信列表

在系统每便加载时,大家须求获撤消息列表,下边正是加载消息列表的代码:

 

         private void HelloForm_Load(object sender, System.EventArgs e)

         {

              QueryMessages();

         }

 

         private ISessionFactory factory;

         private void QueryMessages()

         {

              //查询音讯列表

              Configuration cfg = new Configuration();

              cfg.AddAssembly(“HelloNHibernate”);

 

              factory = cfg.BuildSessionFactory();

              ISession session = factory.OpenSession();

 

              IList messages =
session.CreateCriteria(typeof(Message)).List();

 

              this.lbMsg.Items.Clear();

              foreach(Message msg in messages)

                   this.lbMsg.Items.Add(msg);

              session.Close();

         }

 

在QueryMessages方法中,我们第②创制2个Configuration类,然后调用AddAssembly方法运用反射方法将装配件中定义的兼具以.hbm.xml命名的Mapping文件加载到系统中,而BuildSessionFactory方法则使用app.config和hbm.xml配置文件中的定义创设2个SessionFactory,然后用SessionFactory工厂类创制二个Session会话类,通过调用会话类的标准化查询办法CreateCriteria重返全体品种为
Message的指标列表。最终,边历列表将新闻对象添加到列表框中,并关闭Session,释放ADO.Net的连年对象。 

丰盛音讯 

累加音信稍微有一些见仁见智的是,每回添加时大家都运维1个业务,保障添加音讯操作的原子性,代码如下:

         private void btnAdd_Click(object sender, System.EventArgs e)

         {
              //添加新闻

              if (this.tbMsg.Text.Trim()==String.Empty)

              {

                   MessageBox.Show(“音信输入框无法为空!”);

                   return;

              } 

              Message msg=new Message();

              msg.Text=this.tbMsg.Text.Trim(); 

              ISession session=factory.OpenSession();

              ITransaction transaction = session.BeginTransaction(); 

              session.Save(msg);

              transaction.Commit();

              session.Close(); 

              this.lbMsg.Items.Add(msg);

         }

运作后,添加几条记下,用Sql
Server能够洞察到数据库中的数据示意入下: 

去除新闻 

除去新闻的操作同添加比较接近,代码示意如下:

         private void btnDel_Click(object sender, System.EventArgs e)

         {

              //删除消息

              if (this.lbMsg.SelectedIndex==-1)

              {

                   MessageBox.Show(“请选中要去除的音信!”);

                   return;

              }

 

              Message msg=(Message)lbMsg.Items[lbMsg.SelectedIndex];

 

              ISession session=factory.OpenSession();

              ITransaction transaction = session.BeginTransaction(); 

              session.Delete(msg);

              transaction.Commit();

              session.Close(); 

              this.lbMsg.Items.RemoveAt(lbMsg.SelectedIndex);        

         } 

成功地点的顺序后,我们会发觉一切经过中大家尚无写一条Sql语句就实现了丰硕、删除、查询数据的功效,全部的Sql语句都由NHibernate在后台为大家完毕了,要想观察NHibernate生成的Sql语句的话,大家能够运转Sql
Server的轩然大波探查器来监视程序运行进度中的Sql,如下图表示: 

总结

   
在本文中,大家演示了怎么行使NHibernate,在不行使Sql的情形下实例化三个指标,修改属性,并将其保存到数据库中。在此起彼伏小说中,笔者还将同大家一块探索怎样映射对象的涉嫌,如一对多,多对多,继承、聚集,以及面向对象的口径查询和HQL语言等情节。

转自Delphi深度探索 
出处:http://delphi.sharpplus.com/DotNet/NHibernate1.htm

图片 1

图片 2

dotCloud 重借使依照 PaaS 平台为开发者或开发商提供技能劳务。什么是 PaaS
呢?PaaS 的齐全是 Platform as a
Service,也正是阳台即服务,那几个概念在2009年热的一无可取,直到未来也没凉下来。举个例子来说,守旧的软件产品开发一般是这么的:

① 、明确产品稳定和供给,分明第二遍迭代的界定。
② 、制作界面原型。
③ 、技术选型,然后依据技术选型为每一种开发者搭建开发环境和技术栈,例如 Java
环境、Python 环境、Ruby 环境、数据库、中间件等等。
肆 、创设基础技术框架和劳动,包含日志、存款和储蓄、新闻、缓存、搜索、数据源、集群扩张等等。
伍 、模拟用户体量,营造测试环境。
陆 、开端编写制定真正的政工代码,完成产品效果。
七 、迭代开发/测试,生生不息,周而复始,直到头发掉光截止……

如 果采取周密的 PaaS
平台,能够直接忽略叁 、四 、5五个步骤。无论你挑选哪个技术栈,PaaS
都会为你提供有关的配套设置,包蕴语言环境、运行环境、存款和储蓄和各样基础服务。dotCloud
不仅辅助诸如 PHP、MySql 等历史观技术框架,还包含 Node.js、MongoDB
等新生技术。基于 dotCloud 提供的开发工具和技能框架,你能够直接选用dotCloud 的 SDK
编写代码和营造业务服务,并在联网的时候把这一个代码推送到云端,实现自动计划和测试。

dotCloud
把供给花费多量日子的手工业工作和重复劳动抽象成组件和服务,并置于了云端,此外,它还提供了各类监督、告警和操纵效果,方便开发者管理和监督检查本人的制品。
dotCloud 最初运转在 亚马逊(Amazon) 的 EC2 上,可是由于 dotClout
中度的抽象层次,理论上 dotCloud
能够运作在五花八门的云服务方面(作者猜那便是 Docker 的功绩)。

方方面面看起来都以那么的美好,若是后来的政工依照这一个考虑进行下去的话,软件厂商和程序员都会松好几口气,这样大家的毛发还是能够和「普通客车站」里的人一样,倔强的飘在风里。

图片 3

不满的是,大家到达的是「中关村大巴站」!

PaaS
并不曾这么一向春暖花开下去,事实上给开发者或程序猿做东西平素是件10分惊险的作业,程序猿是一种很意外的动物,就算她们不时分不清楚女友的发型和衣裳款
式,不过对开发环境和开发工具却卓殊乖巧并需求极高,稍不放在心上就会损伤到他们脆弱的心。所谓文人相轻,程序猿也不例外,对自个儿人常常是下死手的。所
以,PaaS
的定义虽好,可是由于认知、理念和技能的局限性,市集的接受度并不高,市集的规模也不够大。

除 此之外,还有巨头不断进场搅局,IBM 的蓝云,微软的 Azure,亚马逊(Amazon) 的
EC2,谷歌 的 GAE,VMware 的 Cloud Foundry
等等,可谓强敌环伺,而且强敌都不差钱,想玩多久就玩多长时间,想玩多大玩多大。在那种景况下,即便dotCloud 在二〇一二年底得到了一千万美元的融通资金,但还是困难。

再也无法那样下去了!dotCloud 的开山 Solomon Hykes
把大家集合到联合,说,大家过的不舒适,也不能让外人痛快了,干脆把大家的为主引擎开源扔到市面上看看,怎样?大家面面相觑,最终把拳头砸到桌面上,就这么办。

山重水复疑无路,出现转机又一村!

那 个基于 Linux Container
技术的主干线管道理引擎一经开源立时获得了「产业界」的激烈吹捧,首当其冲的自然是先后猿们。看到好的开源产品,那帮常常静若处子的货色就如猴子看到卖桃的一
样,一窝蜂冲上去,边吃边说好吃。这一个容器管理引擎大大下落了容器技术的运用门槛,轻量级,可移植,虚拟化,语言非亲非故,写了程序扔上去做成镜像能够四处安排和周转,开发、测试和生产条件到底统一了,仍可以举行财富管理控制和虚拟化。程序员们流着口水惊呼,太有利了,太方便了。

产业界多少个大佬也没闲着,看看程序员们欢畅雀跃,再看看自身平台上笨重的
PaaS,纷繁表示要衔接或帮忙这几个引擎。连最古板的过气带头四弟微软都信誓旦旦的说,要以Windows
原生的不二法门运行那么些引擎。

那么些引擎的名字叫做 Docker,以 Go 语言写成。

那 个结果是 dotCloud
公司的多少个开创者万万没悟出的,他们自然是根据穷小子情势来培育 Docker
的,没成想直接蹦出多个翩翩多姿的大雅观的女生,明眸善睐,顾盼生姿,不仅把各项程序猿迷的思绪颠倒,而且旁边多少个高耸的楼房里的土豪也经常过来搭讪聊天。哥儿
多少个坐不住了,初步球组织商。

吾本来是想捡点芝麻,结果怀里掉了个大西瓜,如何做?
目光坚定,一往直前,为了优质持续捡芝麻!
你傻啊,别和格拉斯哥这一个产品主任学,这么好的机会砸脑门上,咱就甭躲了,专心作育西瓜吧。

从 此以往,他们初阶专心研究开发 Docker
产品和掩护相关社区,过上了甜美而高兴的活着。二〇一二年1六月 dotCloud
公司改名为 Docker 股份有限集团,贰零壹陆年三月 Docker
发表把阳台即服务的事情「dotCloud」出售给位于酒花之国德国首都的阳台即服务提供商「cloudControl」,dotCloud
的野史告一段落。同年6月,Docker 内部职工 詹姆斯 Turnbull
发布了面向开发者、运转和系统一管理理员的 Docker 电子书《The Docker Book》。

过 去13个月,Docker
神速成长为云总计有关领域最受欢迎的开源项目,亚马逊、谷歌(Google)、IBM、Microsoft、Red
Hat 和 VMware 分别表示曾经帮助 Docker 技术或准备援救。听大人讲,有 Linux
的地点,就能够运转 Docker。看意况 Windows 也快了。

特此栽花花不开,无心插柳柳成荫!

Docker 这么些技能到底能缓解哪些难题啊?预感后事怎么样,且听下回分解。

明天题图来自底特律辣个项目老总的留影创作,模特是她的大美丽的女生爱妻。

原文:http://www.oschina.net/news/57838/docker-dotcloud

连带链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图