欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Nhibernate入門(mén) - dinghao - 博客園
Nhibernate入門(mén) 對大部分Nhibernte操作,都寫(xiě)了一個(gè)Demo,映射文件全部手寫(xiě)(手疼),看完后會(huì )對Nhibernte有個(gè)全面的了解。不想看文字的,可以看看附件中的代碼。什么是NhibernateNhibernate會(huì )把數據庫中的表用對象圖的形式表現出來(lái),對開(kāi)發(fā)人員來(lái)說(shuō),他們面對的不是底層的ADO,DateSet等結構,而是包含業(yè)務(wù)邏輯的對象。Nhibernate足夠聰明,它能做到自動(dòng)、透明的持久化對象圖,這節省了大量的開(kāi)發(fā)時(shí)間,也彌補了對象設計和數據庫設計間的不對稱(chēng)性。Nhibernte主要用來(lái)解決復雜的業(yè)務(wù)邏輯,而不適合簡(jiǎn)單邏輯或以數據為中心的系統。Nhibernte中的幾個(gè)重要對象下面介紹Nhibernate中常用的幾個(gè)對象,首先是ConfigurationConfigurationConfiguration負責管理Nhibernate的配置信息以及類(lèi)與數據庫之間的映射文件(*.hbm.xm),負責創(chuàng )建ISessionFactory。Nhibernate可以通過(guò)下面兩種方式進(jìn)行初始化:一、配置文件配置文件是最常用的方式,靈活簡(jiǎn)單 NHibernate.Dialect.MsSql2000Dialect NHibernate.Connection.DriverConnectionProvider NHibernate.Driver.SqlClientDriver Data Source=DD-10980FA277D7;Database=sampledb;User ID=sa;Password=sa; ReadCommitted sampledb.dbo true 下面的代碼會(huì )調用默認的hibernat.cfg.xml配置文件:Configuration cfg = new Configuration().Configure();如果要用非默認文件初始化可以用下面代碼:Configuration cfg = new Configuration().Configure(specificConfigName);二、通過(guò)代碼設置Configuration屬性,這種方式不推薦使用。通過(guò)配置文件名 Configuration cfg = new Configuration().AddFile("Item.hbm.xml").AddFile("Bid.hbm.xml");通過(guò)內嵌資源 Configuration cfg = new Configuration().AddClass(typeof(NHibernate.Auction.Item)).AddClass(typeof(NHibernate.Auction.Bid));這種方式自動(dòng)加載對應類(lèi)名稱(chēng)的hbm.xml文件。通過(guò)程序集Configuration cfg = new Configuration().AddAssembly( "NHibernate.Auction" );這種方式會(huì )加載指定程序集中所有的hbm.xml文件。注意:Nhibernate需要的只是hbm.xml文件,而不需要每個(gè)文件對應的類(lèi),類(lèi)信息有Nhibernte通過(guò)反射與動(dòng)態(tài)代理得到。ISessionFactoryISessionFactory管理數據庫的映射關(guān)系、二級緩存和Sql語(yǔ)句池,負責創(chuàng )建Session,重量級對象,一個(gè)數據庫對應一個(gè),不能頻繁創(chuàng )建,一般采用單例模式。下面語(yǔ)句創(chuàng )建了ISessionFactoryISessionFactory sessions = cfg.BuildSessionFactory();ISessionISession作為Nhibernate的一級緩存,是最常用的對象,ISession的操作比較復雜,涉及到的內容很多,后面會(huì )詳細介紹。下面語(yǔ)句創(chuàng )建ISessionISession session=sessions.OpenSession();持久化類(lèi)與映射文件下面的例子實(shí)現最簡(jiǎn)單的持久化操作。假定我們已經(jīng)抽象出了某個(gè)業(yè)務(wù)領(lǐng)域的域模型:包含客戶(hù)、訂單??蛻?hù)有客戶(hù)名,訂單包含訂單號,并且要求根據訂單能找到對應的客戶(hù)信息。首先創(chuàng )建持久化類(lèi)持久化類(lèi)作為域對象使用,可以是標準的C#類(lèi),也可以是POCO類(lèi)型,如果持久化類(lèi)遵循POCO模型,Nhibernate可以工作的更好。在最新的Nhibernate中,默認了屬性的延遲加載,為了能夠讓動(dòng)態(tài)代理創(chuàng )建持久化的代理對象,必須把熟悉設置為Virtual,否則通過(guò)lazy=false關(guān)閉延遲加載。不要混淆持久化類(lèi)與持久化狀態(tài),持久化類(lèi)沒(méi)有狀態(tài)概念,它可以處于任何狀態(tài)。用C#實(shí)現上面的域模型定義Customer:public class Customer { public Customer() { } public Customer(string name) { _name = name; } private int _id; public virtual int Id { get { return _id; } set { _id = value; } } private string _name; public virtual string Name { get { return _name; } set { _name = value; } }}定義Order,并建立到Customer的單向關(guān)聯(lián):public class Order { public Order(string orderno,Customer c) { _orderNumber = orderno; _customer = c; } public Order() { } private int _id; public virtual int Id { get { return _id; } set { _id = value; } } private string _orderNumber; public virtual string OrderNumber { get { return _orderNumber; } set { _orderNumber = value; } } private Customer _customer; public virtual Customer Customer { get { return _customer; } set { _customer = value; } }}到此持久化類(lèi)以及定義完,下面要做的是把它映射到表。在Nhibernate中通過(guò)配置文件實(shí)現映射,這保證了域模型的可移植性。映射文件以nbm.xml作為后綴名,映射文件名稱(chēng)可以任意,但是最好和持久化類(lèi)同名。其次創(chuàng )建映射文件Customer的映射文件Customer.hbm.xml Order.hbm.xml 配置文件完成下面的幾類(lèi)映射一、首先通過(guò)OID建立對象引用和數據表主鍵間的映射在.net中,通過(guò)引用來(lái)唯一標識一個(gè)對象,而在數據庫中用主鍵唯一標識一條記錄,因此必須建立對象與數據庫表記錄之間的一一對應關(guān)系。這種關(guān)系在Nhibernate中通過(guò)OID建立。如Customer.hbm.xml OID通過(guò)id元素映射,通常對應表的主鍵(ID),但這也不是強制性的,OID的目的是為了建立一一映射關(guān)系。二、建立類(lèi)和表之間的關(guān)系要建立下面幾種映射:通過(guò)class元素建立類(lèi)名稱(chēng)與表名稱(chēng)的映射:通過(guò)property元素建立類(lèi)屬性和表字段的映射 Type可以為Nhibernate類(lèi)型、.net類(lèi)型自定義類(lèi)型,此處用的是Nhibernate類(lèi)型。建立對象間關(guān)系和表關(guān)系的映射,如把對象單向多對一關(guān)聯(lián)映射為外健關(guān)系 建立一些輔助功能,這些能讓nhibernate把持久化做的更好,如:延遲加載,抓取策略以及為更好生成數據庫schema而設置的特性(column 特性)等。下面的配置為數據庫架構生成器提供了更詳細信息: 到此,已經(jīng)建立了持久化類(lèi)和數據表的關(guān)系,以后就可以透明持久化數據,Nhibernate會(huì )把我們對持久化類(lèi)的操作通過(guò)Sql映射到數據庫。這時(shí)我們也從煩人的ADO中解脫出來(lái),可以把精力放到業(yè)務(wù)關(guān)系上,著(zhù)力解決實(shí)際問(wèn)題,而不是技術(shù)問(wèn)題。 最后要做的是通過(guò)Session把業(yè)務(wù)數據存儲到數據庫。簡(jiǎn)單的CRUD操作,其中Session是Sessin接口的實(shí)例,例子中省去了Session管理。 [Test] public void Insert() { Customer c1 = new Customer("ding"); Session.Save(c1); } [Test] public void Select() { Customer c1 = Session.Load(1); } [Test] public void Update() { Customer c1 = Session.Load(1); c1.Name = "dinghao"; Session.Save(c1); } [Test] public void Delete() { Customer c1 = Session.Load(1); Session.Delete(c1); }代碼是不是很簡(jiǎn)單?Nhibernate就是如此簡(jiǎn)便。因為涉及到Session,稍做些解釋?zhuān)@些有利于后面其他概念的理解和優(yōu)化Nhibernate。Session作為一級緩存,維護著(zhù)內存中的對象圖,每當加載對象時(shí)Session就保存對象的一份引用,使之不被回收,作為緩存待用。如:Customer c1 = Session.Load(1);會(huì )創(chuàng )建Customer實(shí)例的兩份引用,一份保存在c1,另一份保存在Session,這樣即使c1不在引用Customer,只要Session不被情空,Customer對象仍然存活。這樣查詢(xún)時(shí)如果緩存命中,就不會(huì )再讀取數據庫,提高了效率。Customer c1 = new Customer("1");Session.Save(c1);執行insertCustomer c2 = Session.Get(c1.Id); //緩存中有數據,不會(huì )執行select。Session還可以提供更優(yōu)化的Sql,因為只有在清理緩存時(shí)才執行sql,這也就提供了一個(gè)優(yōu)化sql的時(shí)機,這時(shí)可以通過(guò)一些策略來(lái)使Nhibernate生產(chǎn)更高效的sql語(yǔ)句,優(yōu)化后面有更詳細說(shuō)明。但是Session的缺點(diǎn)也很明顯,它必須維護緩存于數據庫的一致性,這造成沒(méi)有辦法實(shí)現高效的更新和刪除操作,每次更新刪除時(shí)必須通過(guò)執行查詢(xún),來(lái)保證Session不存在臟數據。如下面的刪除操作 [Test] public void Delete() { Customer c1 = Session.Load(1); Session.Delete(c1); } 首先執行Load,然后刪除。這是Nhibernate不能解決的問(wèn)題,是Session模型本身的缺陷,一些優(yōu)化只能緩解這種性能損失,所以批量操作最好通過(guò)NativeSql。Nhibernte1.2的文檔說(shuō),通過(guò)把batch-size設置為0,SqlServer會(huì )執行批量更新、刪除。沒(méi)有經(jīng)過(guò)測試?;蛟S后續版本會(huì )提供無(wú)狀態(tài)的Session和bulk更新刪除(Hibernate3)。狀態(tài)對象分三種狀態(tài),理解狀態(tài)是理解Session管理的基礎臨時(shí)狀態(tài)對象位于內存,但沒(méi)有被Session管理,不對應數據庫記錄。持久狀態(tài)已經(jīng)加入到Session中,由Session管理,Nhibernate負責持久化,有對應記錄。游離狀態(tài)沒(méi)有被Session管理,但可能對應一條紀律,也可能沒(méi)有。簡(jiǎn)單的說(shuō)這條記錄有主鍵值,Nh會(huì )把它作為游離態(tài),否則作為臨時(shí)態(tài)。對象轉換圖實(shí)體和值對象Nhibernate中對象分兩種,一種是值一種是實(shí)體,這是非常重要的概念。兩者的本質(zhì)區別是值沒(méi)有OID,這就意味著(zhù)值是個(gè)殘缺的實(shí)體,他不能單獨持久化,不能建立到實(shí)體的關(guān)聯(lián)。抓取策略新版種通過(guò)lazy和fetch定義抓取策略,其中lazy定義什么時(shí)候檢索數據,fetch定義如何檢索數據。兩種結合使用,lazy默認為true,fetch默認是select。由于默認采用延遲加載,如果Session關(guān)閉后,訪(fǎng)問(wèn)沒(méi)有被加載對象會(huì )拋異常,可以調用NhibernteUtil.Initialize();使其被加載?;蛘逽ession關(guān)閉前對數據做初始化。Fetch默認采用select,這通常導致N+1問(wèn)題,其中的一種解決方式是,把fetch設置為join,以采用左外鏈接檢索。批量檢索,通過(guò)batch-size可以縮減生成的Select語(yǔ)句數量查詢(xún)方式HqlHql是面向對象的查詢(xún)語(yǔ)言,雖然看起來(lái)類(lèi)似于sql,這只是為了讓熟悉sql的用戶(hù)更容易使用,Hql用到的是持久化類(lèi)。幾個(gè)例子: [Test] public void AgrigateFunction() { IList customers = Session.CreateQuery("select max(c.Age),sum(c.Age) from Customer c").List(); Console.Write(customers.Count); } [Test] public void InnerJoin() { IList customers = Session.CreateQuery("select c from Customer c inner join c.Orders o where c.Name like 'T%'").List (); Console.Write(customers.Count); } [Test] public void FetchLeftJoin() { IList customers = Session.CreateQuery("from Customer c left join fetch c.Orders o where c.Name like 'T%'").List (); Console.Write(customers.Count); }QBC提供面向對象的查詢(xún)語(yǔ)法,不需要了解Sql,就可以使用。如: [Test] public void WhereSelect() { IList customers = Session.CreateCriteria(typeof(Customer)).Add(Expression.Eq("Name", "Tom")).List(); IList customers2 = Session.CreateCriteria(typeof(Customer)).Add(Expression.Eq("this.Name", "Tom")).List(); }下面是簡(jiǎn)單的Hql和QBC操作NativeSql最新的Nhibernte增強了本地sql查詢(xún),感覺(jué)可以比上Ibatise了,比以前好用很多。如:實(shí)體查詢(xún),把sql語(yǔ)句查詢(xún)結果自動(dòng)映射到類(lèi) [Test] public void Entiy() { IList c = Session.CreateSQLQuery("select * from CUstomers").AddEntity(typeof(Customer)).List(); Console.Write(c.Count); }標量查詢(xún):把查詢(xún)結果映射到集合[Test] public void ScaleSelect() { IList c =Session.CreateSQLQuery("select * from CUstomers").AddScalar("Name", NHibernateUtil.String) .AddScalar("Age", NHibernateUtil.Int32).List(); Console.Write(c.Count); } 數據庫設計和類(lèi)設計關(guān)系數據庫和OO的不對稱(chēng)性,才使得ORM有用武之地,首先是粒度,數據庫為了效率一般采用粗粒度模型,而OO為了重用性、簡(jiǎn)便性多采用細粒度模型。這要求Nhibernte必須能透明的再兩者間轉換。其次是OO的一些特性,如關(guān)聯(lián)、繼承、多態(tài)、組合,在數據庫中沒(méi)有對應概念,這時(shí)Nhibernte要解決的第二個(gè)問(wèn)題。以關(guān)聯(lián)為例,類(lèi)有一對一,一對多,多對一,多對多關(guān)聯(lián),并且這些關(guān)系是有方向的。數據庫并不存在這些關(guān)系,也沒(méi)有任何方向問(wèn)題,但是數據庫通過(guò)SQL可以模擬任意的關(guān)聯(lián)關(guān)系。所以只要設置好Nhibernte的映射元數據,就可以把對象關(guān)聯(lián)映射到數據庫。后面有這幾種映射方式的例子,見(jiàn)代碼把OO概念映射到數據庫下面的通過(guò)例子說(shuō)明怎么映射OO概念到數據庫,雖然分開(kāi)說(shuō)明,但他們不是孤立的。映射關(guān)聯(lián)關(guān)系類(lèi)的關(guān)聯(lián)不一定需要映射到數據庫,反之也一樣。管理分實(shí)體間的關(guān)聯(lián)與實(shí)體到值對象的關(guān)聯(lián),其中實(shí)體關(guān)聯(lián)最常用。通過(guò)兩種方式映射下面的關(guān)聯(lián)關(guān)系實(shí)體間的one2many關(guān)聯(lián)代碼: private IList _orders; public virtual IList Orders { get { return _orders; } set { _orders = value; } }建立文件: 如果不希望Order有自覺(jué)的生命期,可以建立實(shí)體與值對象間的關(guān)聯(lián),代碼:private IList _valueOrders; public virtual IList ValueOrders { get { return _valueOrders; } set { _valueOrders = value; } }映射文件: 測試代碼: [Test] public void ComponentSet() { Customer c = new Customer("ding"); IList os = new List(); os.Add(new Domain.Order("dd",3)); c.ValueOrders = os; Session.Save(c); }映射組成關(guān)系組件在Nhibernate中用于映射對象間的組成關(guān)系組件是值對象(Value),用Componet以及包含Component的其他元素映射。如,映射下面的模型 private Address _homeAddress; public virtual Address HomeAddress { get { return _homeAddress; } set { _homeAddress = value; } } private Address _companyAddress; public virtual Address CompanyAddress { get { return _companyAddress; } set { _companyAddress = value; } }測試代碼[TestFixture] [Category("Composite")] public class Composite:NhSession { [Test] public void SaveAll() { Customer c = new Customer("ding"); Address ha = new Address("ha", "bj", "hb", "0000"); Address ca = new Address("ha", "bj", "hb", "0000"); Session.Save(c); } [Test] public void SaveWithoutComponent() { Customer c = new Customer("ding"); Session.Save(c); } [Test] public void NullSemantic() { Customer c = new Customer("ding"); Session.Save(c); Customer c2 = Session.Load(c.Id); Assert.IsNull(c2.HomeAddress); } }映射繼承關(guān)系以及多態(tài)映射繼承有下面三種方式:http://www.martinfowler.com/eaaCatalog/singleTableInheritance.htmlhttp://www.martinfowler.com/eaaCatalog/classTableInheritance.htmlhttp://www.martinfowler.com/eaaCatalog/concreteTableInheritance.html現在以例子說(shuō)明table per class與concrete table inheritance繼承方式。假設存在下面的對象關(guān)系:如果用為了提高數據庫效率,可以通過(guò)一個(gè)表映射繼承,也就是單表繼承首先再數據庫設置一個(gè)標志例,該列說(shuō)明雇員的類(lèi)型。程序代碼:見(jiàn)附件映射關(guān)系: 測試代碼: [TestFixture] [Category("PerClassInheritence")] public class PerClassInheritence:NhSession { [Test] public void SaveSubClass() { IEmployee se = new SalariedEmployee("ding",3); Session.Save(se); } /**//// /// 多態(tài)查詢(xún) /// [Test] public void GetBase() { IList es= Session.CreateQuery("from IEmployee").List(); Console.Write(es.Count); } [Test] public void GetSubBase() { int id = SaveHourEmployee(); IEmployee es = Session.Get(id); Console.Write(es.ToString()); } private int SaveHourEmployee() { IEmployee he = new HourlyEmployee("ding", 3); Session.Save(he); return he.Id; } }這種方式至持多態(tài)查詢(xún)。一個(gè)具體類(lèi)一個(gè)表,這種方式不能映射基類(lèi),所以不支持多態(tài)查詢(xún)。代碼省略,見(jiàn)附件集合映射集合映射分兩類(lèi),一是實(shí)體類(lèi)型集合,如關(guān)聯(lián)的多端,另一類(lèi)是值類(lèi)型集合。集合映射有兩種語(yǔ)義,一種是.net中集合的概念,另一種是nhibernate中集合的概念,前種在代碼文件中體現,后一種體現在映射文件中。如用bag映射IList,ICollection。集合對應數據庫中的表,表必須存在外鍵、做為集合元素的列,如果用含有索引語(yǔ)義的集合做映射,還必須包含能做索引的項。這部分和關(guān)聯(lián)關(guān)系密切,可以結合理解。代碼種經(jīng)常會(huì )使用到集合,下面看看怎么把集合映射到數據庫。假設有下面的代碼private ISet _images; public virtual ISet Images { get { return _images; } set { _images = value; } } private IDictionary _mapImages; public virtual IDictionary MapImages { get { return _mapImages; } set { _mapImages = value; } } private IList _valueOrders; public virtual IList ValueOrders { get { return _valueOrders; } set { _valueOrders = value; } }映射Set,set是無(wú)序,沒(méi)有索引,沒(méi)有重復值的集合 映射Map,map包含鍵值對 映射組件見(jiàn)關(guān)聯(lián)關(guān)系集合排序,分兩種一種為內存排序,另一種為通過(guò)Sql排序。內存排序可以通過(guò)實(shí)現IComparer接口,實(shí)現自定義排序。Sql排序通過(guò)order-by特性制定列名及排序機制,如:order-by=“Filename desc”怎么理解Nhibernte理解NHibernate,應該從對象開(kāi)始,即總是要考慮如何把對象映射到對應的數據庫結構,而不是反過(guò)來(lái)思考??紤]Nhibernte生成的Sql是否過(guò)量,如果是考慮優(yōu)化。Nhibernate,確實(shí)很復雜,我們用到的一般只是他的一部分功能。開(kāi)發(fā)方式開(kāi)發(fā)可以從數據庫建模開(kāi)始,也可以從OO建模開(kāi)始。如果從數據庫開(kāi)始,就要把數據庫表映射為類(lèi)、hbm.xml文件。反之則把OO映射為表、hbm.xml文件。由于Nhibernte可以可以隔離類(lèi)和數據庫,我認為這種情況下兩種方式區別已經(jīng)不大,主要的問(wèn)題在于哪知能更好的自動(dòng)生成,以及在以后修改一方時(shí)能更好的自動(dòng)更正另一方。不過(guò)最重要的一點(diǎn)是,不論從哪一方開(kāi)始設計,最終的對象都不能是表的直接映射,否則采用Nhibernte也就沒(méi)有什么意義了。好像還可以同時(shí)進(jìn)行,建立抽象模型后,一邊設計數據庫,一邊設計持久化類(lèi),最后用hbm.xml映射兩者的關(guān)系。這種方式好像是最優(yōu)的,缺點(diǎn)就是沒(méi)有辦法用自動(dòng)生成工具,工作量較大。輔助工具最常用的是通過(guò)書(shū)庫架構生成類(lèi)和映射文件,目前支持1.2的工具不多,下面是支持1.2的模版:http://www.codeproject.com/useritems/NHibernate_Templates.asp但是必須要明確的是,生成的類(lèi)一定要看看是否符合OO的標準,不要把任何表都映射為類(lèi)。其他工具包括,通過(guò)hbm.xml生成數據庫,通過(guò)特性映射而不用寫(xiě)hbm.xml資料中文:孫衛琴,精通hibernte,java對象持久化技術(shù)詳解英文:nhibernate referenc,hibernate in action,Nhibernae in action(十月出版) 認真寫(xiě)了好久的例子:http://www.cnblogs.com/files/bluewater/nhiebernatedemo.rar 為什么不選用ActiveRecordhttp://www.cnblogs.com/bluewater/archive/2007/08/14/855557.html
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
『Spring.NET NHibernate 泛型』框架搭建之DAO(三)★
封裝NHibernate代碼
NHibernate快速指南(翻譯
Nhibernate3.3.3sp1基礎搭建測試
NHibernate 3.x新功能實(shí)踐(一) QueryOver(上)
(譯)在A(yíng)SP.NET Web API中使用Redis
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久