-----------android培訓(xùn)、java培訓(xùn)、java學(xué)習(xí)型技術(shù)博客、期待與您交流!------------
1、HIbernate支持多種數(shù)據(jù)庫,是一種“跨數(shù)據(jù)庫平臺”的ORM框架。使用Hibernate時需要先創(chuàng)建一個session對話,然后開啟Transaction事務(wù)、進(jìn)行數(shù)據(jù)庫讀寫、提交事務(wù)、關(guān)閉會話。Hibernate事務(wù)也支持回滾。2、實體類有3種狀態(tài),分別是臨時狀態(tài)、持久化狀態(tài)、分離狀態(tài)。臨時狀態(tài)(Transient):對象在保存進(jìn)數(shù)據(jù)庫之前為臨時狀態(tài)。這時候數(shù)據(jù)庫中沒有該對象的信息,該對象的Id屬性也為空。如果沒有被持久化,程序退出時臨時狀態(tài)的對象信息將會丟失。持久化狀態(tài)(Persistent):對象在保存進(jìn)數(shù)據(jù)庫后或者從數(shù)據(jù)庫中加載后、并且沒有脫離Session時為持久化狀態(tài)。這時數(shù)據(jù)庫中有該對象的信息,該對象的Id為數(shù)據(jù)庫中對應(yīng)疾苦的主鍵值。由于還在Session中,持久化狀態(tài)的對象可以執(zhí)行任何有關(guān)數(shù)據(jù)庫的操作,例如獲取集合屬性的值等。分離狀態(tài)(Detached):分離狀態(tài)是對象曾經(jīng)處于持久化狀態(tài)、但是現(xiàn)在已經(jīng)離開Session了。雖然分離狀態(tài)的對象有Id值,有對應(yīng)的數(shù)據(jù)庫記錄,但是已經(jīng)無法執(zhí)行有關(guān)數(shù)據(jù)庫的操作。例如,讀取延遲加載的集合屬性,可能會拋出LazyInitializeException。關(guān)鍵詞:Session 數(shù)據(jù)庫記錄臨時狀態(tài)(Transient):數(shù)據(jù)庫中沒有記錄、沒有在Session中。持久化狀態(tài)(Persistent):數(shù)據(jù)庫中有記錄、在Session中。分離狀態(tài)(Detached):數(shù)據(jù)庫中有記錄、沒在Session中。3、Hibernate中有幾個常用的概念SessionFactory、Session、Transaction。注意這里的Session不同于Servlet中的HttpSession,二者雖然都可理解為回話,但使用的情況不一樣。SessionFactory(org.hibernate.SessionFactory):一個線程安全的Session工廠類,能為不同的線程生成不同的Session。SessionFactory維護(hù)者Session相關(guān)的資源,包括數(shù)據(jù)庫連接池、緩存數(shù)據(jù)等。Session(org.hibernate.Session):Session代表用戶的一次操作。Session的生命周期很短,在操作開始時通過執(zhí)行SessionFactory.openSession()生產(chǎn),在操作結(jié)束時通過執(zhí)行session.close()關(guān)閉。Session維護(hù)著Session相關(guān)的資源。包括Transaction、當(dāng)前數(shù)據(jù)連接等。Transaction(org.hibernate.Transaction):Transaction代表一次事務(wù),事務(wù)內(nèi)包括若干的數(shù)據(jù)修改,事務(wù)提交后才生效。如果事務(wù)失敗或回滾,所有的修改都會失效。Hibernate的事務(wù)不同于數(shù)據(jù)庫的事務(wù)。Hibernate可能使用各種機(jī)制保證事務(wù)性,包括JTA(Java Transaction API,Java事務(wù)接口)、第三方事務(wù)管理、數(shù)據(jù)庫事務(wù)等。一個SessionFactory維護(hù)一個數(shù)據(jù)庫。如果有多個數(shù)據(jù)庫,可以創(chuàng)建多個SessionFactory。Hibernate允許程序使用多個SessionFactory同時操作多個數(shù)據(jù)庫。4、配置實體類和數(shù)據(jù)庫表單之間的映射關(guān)系的2種方式:(1)、xml文件配置。XML配置文件時最基礎(chǔ)的配置。一般與實體類在同一個包中,命名風(fēng)格 為 *hbm.xml 即hibernate mapping。(2)、@注解配置。是Java官方的JPA(Java Persistence API)提供的。特殊情況注意:@注解配置時,如果某屬性沒有配置,則默認(rèn)該屬性名與數(shù)據(jù)庫表單列名相同;而XML文件配置時,如果如果某屬性沒有配置,則默認(rèn)該屬性沒有對應(yīng)的數(shù)據(jù)庫表單列,不參與持久化。二者時接人不同的。5、主鍵增長策略 ,數(shù)據(jù)庫自增長與Hibernate自增長產(chǎn)生區(qū)別的特殊情況。但是如果某數(shù)據(jù)庫同時被兩個Hibernate程序使用,那么此時使用Hibernate自增長將會出現(xiàn)錯誤。例如,如果當(dāng)前主鍵值為10,那么Hibernate會認(rèn)為下個主鍵值為11,兩個Hibernate程序插入數(shù)據(jù)時都會講主鍵值設(shè)為11,這時會因為主鍵沖突而導(dǎo)致其中一個寫數(shù)據(jù)失敗。6、數(shù)據(jù)庫普通鍵的屬性(1)Integer類型與int類型的不同之處:Integer默認(rèn)為null,在數(shù)據(jù)庫中冶表現(xiàn)為null,而int默認(rèn)為0,在數(shù)據(jù)庫中冶表現(xiàn)為0。(2)普通屬性使用@Column與@Basic配置。二者都可以省略。如果省略,則全部按照默認(rèn)的爾規(guī)則配置。@Column中可指定@nullable 是否允許為null@unique 是否唯一@insertable 是否允許插入@updatable 是否允許更新@length 列長度@columnDefinition 列類型@scale 整數(shù)長度@PRecision 小數(shù)點精度這些屬性用于生成DDL建表語句。如果屬性對應(yīng)列名與屬性名一致,@Column可以省略。@Temporal。日期屬性如果是java.util.Date類型的,必須要用@Temporal配置日期類型,取值可以為Date、Time、Timestemp。java.sql.Date(只有年月日)、java.sql.Time(只有時分秒)、java.sql.TimeStamp(同時又年月日、時分秒),都是java.util.Date的子類。@Transaction ,臨時屬性,不在數(shù)據(jù)庫表單中生成對應(yīng)列。@Version。使用版本的方式實現(xiàn)配置樂觀鎖。@Basic可為普通屬性配置加載方式,默認(rèn)為即時加載。如果列數(shù)據(jù)比較大,例如大文本類型或者LOB類型,可配置為延遲加載。optional配置該列是否可為null。如果為true,表示該屬性石可選的,可以為null,否則不可以為null。7、JPA 對實體類的要求 由于Java注解需要配置到實體類中,因此JPA要求實體類必須為POJO(簡單Java對象),而不能為String等基本類型。新聞熱點
疑難解答