下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、深入淺出 Hibernate4 開(kāi)發(fā)1第一部分 Hibernate4 入門(mén)一、Hibernate 是什么1.Hibernate 是什么Hibernate 是一個(gè)輕量級(jí)的 ORMap框架。2.ORMap原理(Objecational Map)3.ORMap的基本對(duì)應(yīng)規(guī)則1:類(lèi)跟表相對(duì)應(yīng)2:類(lèi)的屬性跟表的字段相對(duì)應(yīng)3:類(lèi)的實(shí)例與表中具體的一條相對(duì)應(yīng)4:一個(gè)類(lèi)可以對(duì)應(yīng)多個(gè)表,一個(gè)表也可以對(duì)應(yīng)多個(gè)類(lèi)5:DB 中的表可以沒(méi)有主鍵,但是Object 中必須設(shè)置主鍵字段6:DB 中表與表之間的關(guān)系(如:外鍵)成為 Object 之間的關(guān)系7:Object 中屬性的個(gè)數(shù)和名稱(chēng)可以和表中定義的字段個(gè)數(shù)和名稱(chēng)不一
2、樣24. ORMap的實(shí)現(xiàn)方式使用 JDBC,用 SQL 來(lái)操作數(shù)據(jù)庫(kù),只是看動(dòng)態(tài)生成還是人工寫(xiě)代碼來(lái)實(shí)現(xiàn)。大家想想,實(shí)現(xiàn)過(guò) ORMap嗎?二、Hibernate 能干什么1. Hibernate 能干什么Hibernate 主要用來(lái)實(shí)現(xiàn) Java 對(duì)象和表之間的,除此之外還提供還提供數(shù)據(jù)查詢(xún)和3獲取數(shù)據(jù)的方法,可以大幅度減少開(kāi)發(fā)時(shí)人工使用 SQL 和 JDBC 處理數(shù)據(jù)的時(shí)間。Hibernate的目標(biāo)是對(duì)于開(kāi)發(fā)者通常的數(shù)據(jù)持久化相關(guān)的編程任務(wù),解放其中的 95%。對(duì)于以數(shù)據(jù)為中心的程序來(lái)說(shuō),它們往往只在數(shù)據(jù)庫(kù)中使用過(guò)程來(lái)實(shí)現(xiàn)商業(yè)邏輯,Hibernate 可能不是最好的解決方案;對(duì)于那些在基于
3、 Java 的中間層應(yīng)用中,它們實(shí)現(xiàn)面象的業(yè)務(wù)模型和商業(yè)邏輯的應(yīng)用,Hibernate 是最有用的。Hibernate 可以幫助你消除或者包裝那些針對(duì)特定廠商的 SQL 代碼,并且?guī)湍惆呀Y(jié)果集從表格式的表示形式轉(zhuǎn)換到一系列的對(duì)象去。4三、Hibernate1.Hibernate 體系結(jié)構(gòu)52. Hibernate 運(yùn)行時(shí)體系結(jié)構(gòu)“最小”的體系結(jié)構(gòu)方案,要求應(yīng)用程序提供自己的 JDBC連接并管理自己的事務(wù)。這種方案使用了 Hibernate API的最小子集.3.“全面解決”的體系結(jié)構(gòu)方案將應(yīng)用層從底層的 JDBC/JTA API 中抽象出來(lái),而讓Hibernate 來(lái)處理這些細(xì)節(jié)64. Ses
4、Factoryhibernate.SesFactory, 針對(duì)單個(gè)數(shù)據(jù)庫(kù)關(guān)系經(jīng)過(guò)編譯后的內(nèi)存鏡像,是線程安全的(不可變)。它是生成 Ses的工廠,本身要用到 ConnectionProvider。5. Seshibernate.Ses,表示應(yīng)用程序與持久層之間交互操作的一個(gè)單線程對(duì)象,此對(duì)象生存期很短,隱藏了 JDBC 連接,也是 Tranion 的工廠。6. Tranionhibernate.Tranion,應(yīng)用程序用來(lái)指定原子操作單元范圍的對(duì)象,它是單線程的,生命周期很短。它通過(guò)抽象將應(yīng)用從底層具體的 JDBC、JTA 以及 CORBA 事務(wù)開(kāi)。7. ConnectionProviderh
5、ibernate.connection.ConnectionProvider,生成 JDBC 連接的工廠(有連接池的作用)。它通過(guò)抽象將應(yīng)用從底層的 Datasource 或 DriverManager開(kāi)。開(kāi)發(fā)者擴(kuò)展/實(shí)現(xiàn)用,并不給應(yīng)用程序使用。8. TranionFactoryhibernate.TranionFactory,生成 Tranion 對(duì)象實(shí)例的工廠。開(kāi)發(fā)者擴(kuò)展/實(shí)現(xiàn)用,并不給應(yīng)用程序使用。四、Hibernate 的o World1. 創(chuàng)建數(shù)據(jù)庫(kù)Create database hibernate;Use hibernate;Create table student(idprima
6、ry key auto_increment, name varchar(25) not null, age7);Create table admin(idprimary key auto_increment, name varchar(25) not null, age);2. 創(chuàng)建域?qū)ο?)Student.java編寫(xiě) hbm.xmlStudent.hbm.xml8public class Student privaong id; private String name; privateeger age;public Long getId() return id; public void s
7、etId(Long id) this.id = id; public String getName() return name;public void setName(String name) = name; publiceger getAge() return age; public void setAge(eger age) this.age = age; 其中的:要想提示, 需要在 Eclipse 中關(guān)聯(lián)這個(gè)文件, hibernate-map-3.0.dtd可以在hibernate 發(fā)布的包中搜索到,然后在 Eclipse 中,preference-xml-category 添加:如下圖
8、:2)Admin.java使用 AnnoionAdmin.java9Entity Table(name=admin) public class Admin privaong id;private String name;privateeger age;其中Entity表示該對(duì)象是對(duì)應(yīng)與數(shù)據(jù)庫(kù)中的表,是實(shí)體對(duì)象Table(name=admin) 表示對(duì)應(yīng)于數(shù)據(jù)庫(kù)中的admin表Id放在get方法上面,表示是主鍵GeneratedValue() ID 自增3編寫(xiě) hibernate.cfg.xml 文件關(guān)于這個(gè)文件,可以在開(kāi)檔中國(guó)找到例子,當(dāng)然你也可以查看解壓后 projects/etc目錄下的
9、hibernate.cfg.xml 文件。另外,您還需要參見(jiàn) hibernate-configuration-3.0.dtd, 可以利用 windows 的搜索功能找到這個(gè)文件,然后關(guān)聯(lián)到 Eclipse 中讓其能夠提示。10Id GeneratedValue()public Long getId() return id; public void setId(Long id) this.id = id; public String getName() return name;public void setName(String name) = name;publiceger getAge()
10、return age; public void setAge(eger age) this.age = age;Hibernate.cfg.xml11!-com.jdbc.Driverjdbc:/:3306/hibernaterootadmin.hibernate.dialect.Dialecttrue在上面也看到了:這個(gè)是以?xún)煞N方式加載這個(gè)配置, Hibernate 需要通過(guò)這個(gè)配置來(lái)對(duì)實(shí)體類(lèi)進(jìn)行反射以及相關(guān)的操作。數(shù)據(jù)庫(kù)配置:12.hibernate.dialect.Dialectcom.jdbc.Driverjdbc:/:3306/hibernate!- 1 -!- thread -.h
11、ibernate.cache.ernal.NoCacheProvider式來(lái)配置這些項(xiàng):當(dāng)然也可以通過(guò)另使用 perties 文件:將此文件置于 classpath 的根目錄下。4編寫(xiě)測(cè)試用例1)HeUtil.java本類(lèi)是一個(gè)單例對(duì)象,專(zhuān)門(mén)用于產(chǎn)生 sesfactory, 由于 SesFactory 對(duì)象很大,要加載 hibernate 相關(guān)的配置文件,因此只需要在系統(tǒng)啟動(dòng)的時(shí)候創(chuàng)建一份實(shí)例就行了。13public class HibernateUtil private sic final SesFactory sesFactory = buildSesFactory();/*build t
12、he sesfactory with the hibernate.cfg.xmlreturn*/private sic SesFactory buildSesFactory() try / Create the SesFactory from hibernate.cfg.xml Configuration cfg = new Configuration();/ This is nesary, no setting of dialect will be warnedhibernate.dialect.hibernate.dialect.Dialect hibernate.connection.d
13、river_class com.jdbc.Driver hibernate.connection.url jdbc:/:3306/hibernate hibernate.connection.username roothibernate.connection.password adminrootadmin2)測(cè)試實(shí)例14public class AllTests Testpublic void testSave() Student student = new Student(); student.setId(1L);student.setName(); student.setAge(22);S
14、esFactory sf =HibernateUtil.getSesFactory(); Sesses= sf.openSes();cfg.configure();ServiceRegistry sr = new ServiceRegistryBuilder().applySettings( cfg.getProperties().buildServiceRegistry();SesFactory sf = cfg.buildSesFactory(sr);return sf; catch (Throwable ex) System.err.prln(Initial SesFactory cre
15、ation failed! + ex);throw new ExceptionInInitializerError(ex);public synchronized sic SesFactory getSesFactory() return sesFactory;5運(yùn)試實(shí)例點(diǎn)擊運(yùn)行 Junit 測(cè)試實(shí)例,如果沒(méi)拋異常就行了。項(xiàng)目的目錄結(jié)構(gòu)如下:15ses.begranion(); ses.save(student);ses.getTranion().commit();第二部分 Hibernate 的基本配置一、可編程方式配置1. 在 java 代碼中配置不如果在配置 cfg.xml 的時(shí)候,不想
16、在里面配置 hbm.xml 怎么辦呢?可在程序里使用可編程的配置方式,也就是使用程序來(lái)指定在 cfg.xml 里面的配置信息,不這種方式。如下:Configuration cfg= new Configuration().addResource(Item hbm.xml).addResource(Bid hbm.xml);一個(gè)替代方法(有時(shí)是更好選擇)是,指定被的類(lèi),讓 Hibernate 幫你尋找定義文件:Configuration cfg= new Configuration().addClass(hibernate.auction.Item.class).addClass(hiberna
17、te.auction.Bid.class);這種方式消除了任何對(duì)文件名的硬編碼。還可以通過(guò)編程的方式來(lái)指定配置屬性:Configuration cfg = new Configuration().addClass(hibernate.auction.Item.class).setProperty(hibernate.dialect,.hibernate.dialect.InnoDBDialect).setProperty(hibernate.connection.datasource, p/env/jdbc/test).setProperty(hibernate.order_updates,
18、true);2. 其他可以傳入配置屬性的方式1:properties 文件2:xml 文件3:設(shè)置 Java 的系統(tǒng)屬性,形如:java Dproperty=value163. 另外要注意一點(diǎn)hibernate.cfg.Configuration 實(shí)例被設(shè)計(jì)成啟動(dòng)期間( startup-time )對(duì)象,一旦SesFactory 創(chuàng)建完成它就被丟棄了。.cfg.xml-與數(shù)據(jù)庫(kù)二、1. Hibernate 與數(shù)據(jù)庫(kù)連接的方式(1)JDBC示例:17com.jdbc.Driverjdbc:/localhost:3306/hibernaterootadmin1屬性用途hibernate.conne
19、ction.driver_classJDBC 驅(qū)動(dòng)hibernate.connection.urlJDBC URLhibernate.connection.username數(shù)據(jù)庫(kù)用戶(hù)hibernate.connection.password數(shù)據(jù)庫(kù)用戶(hù)hibernate.connection.pool_size連接池容量上限數(shù)目(2)DataSource示例:java:/javassDs2. 連接池 c3p0 配置由于 Hibernate 自己實(shí)現(xiàn)的連接池不太好,在項(xiàng)目中,建議使用工業(yè)級(jí)的連接池,比如:c3p0,Hibernate包中帶有 c3p0,下面就是其基本配置示例:oracle.jdbc
20、.driver.OracleDriverjdbc:oracle:thin:localhost:1521:orcljavassjavass52018050183.cfg.xml-可選配置194. 數(shù)據(jù)庫(kù)的 catalog 和 schema,引入 catalog 和 schema 來(lái)解決。從概念上說(shuō),為了解決數(shù)據(jù)庫(kù)中元素命名一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)包含多個(gè) Catalog,每個(gè) Catalog 又包含多個(gè) Schema,而每個(gè) Schema 又包含多個(gè)數(shù)據(jù)庫(kù)對(duì)象(表、視圖、字段等)。比較簡(jiǎn)單而常用的實(shí)現(xiàn)方式是使用數(shù)據(jù)庫(kù)名作為 Catalog 名,使用用戶(hù)名作為 Schema名,各種數(shù)據(jù)庫(kù)系統(tǒng)對(duì) Catalo
21、g 和 Schema 的支持具體可參見(jiàn)下表:205.cfg.xml-JDBC 連接屬性216.cfg.xml-緩存屬性227.cfg.xml-事務(wù)屬性238.cfg.xml-事務(wù)策略(1)為了讓?xiě)?yīng)用在 JDBC 事務(wù)和 JTA 事務(wù)環(huán)境中可以移植,建議使用可選的 HibernateTranion API, 它包裝并隱藏了底層系統(tǒng)。(2)通過(guò)設(shè)置 Hibernate 配置屬性 hibernate.tranion.factory_class 來(lái)指定一個(gè) Tranion實(shí)例的工廠類(lèi)。(3)有三個(gè)標(biāo)準(zhǔn)(內(nèi)建)的選擇1)委托給數(shù)據(jù)庫(kù)(JDBC)事務(wù)(默認(rèn))Hibernate4 以前:.hibernate
22、.tranion.JDBCTranionFactoryHibernate4 里面:.hibernate.engine.tranion.ernal.jdbc.JDBCTranionFactory2)JTA 事務(wù),如果在上下文環(huán)境中存在運(yùn)行著的事務(wù)(如, EJB 會(huì)話 Bean 的方法),則委托給容器管理的事務(wù),否則,將啟動(dòng)一個(gè)新的事務(wù),并使用 Bean 管理的事務(wù)。Hibernate4 以前:hibernate.tranion.JranionFactoryHibernate4 里面:hibernate.engine.tranion.ernal.jta.JranionFactory3)委托給容器管
23、理的 JTA 事務(wù)Hibernate4 以前:hibernate.tranion.CMTTranionFactoryHibernate4 里面:.hibernate.engine.tranion.ernal.jta.CMTTranionFactory也可以定義屬于你自己的事務(wù)策略(如,針對(duì)CORBA 的事務(wù)服務(wù))249.cfg.xml-其他屬性2510.cfg.xml-方言方言可以在 Hibernate 提供的文檔中找到,不用可以去,即便你記住了,也不代表你是有多牛。2611.cfg.xml-日志(1)Hibernate 使用 SLF4J 來(lái)做日志,可以根據(jù)你選擇的綁定把日志輸出到日志框架(N
24、OP、Simple、log4j ver1.2、JDK 1.4 logging、JCL 或 logback)上。(2)需要在 classpath 里加入 slf4j-api.jar 和你選擇的綁定的 JAR文件(使用 Log4J時(shí)加入 slf4j-log4j12.jar),當(dāng)然別忘了加入 log4j 自己的 jar 包。(3)Hibernate 日志類(lèi)別.hbm.xml 配置三、1. Hibernate-map元素這個(gè)元素是hbm.xml 配置的根元素,定義如下:27schema(可選)數(shù)據(jù)庫(kù) schema 的名稱(chēng),表名會(huì)加上所指定的 schema 的名字?jǐn)U展為表的全限定名。Catalog(可選
25、)數(shù)據(jù)庫(kù) catalog 的名稱(chēng),表名會(huì)加上所指定的 catalog 的名字?jǐn)U展為表的全限定名。default-cascade (可選-默認(rèn)為 none)默認(rèn)的級(jí)聯(lián)風(fēng)格。指定了未明確注明 cascade 屬性的 Java 屬性和集合類(lèi),Hibernate 會(huì)采取什么樣的默認(rèn)級(jí)聯(lián)風(fēng)格。auto-import 屬性默認(rèn)讓在查詢(xún)語(yǔ)言中可以使用非全限定名的類(lèi)名。default-acs (可選-默認(rèn)為 property)Hibernate 用來(lái)所有屬性的策略??梢酝ㄟ^(guò)實(shí)現(xiàn)PropertyAcsor 接口自定義。default-lazy(可選- 默認(rèn)為 true)指定了未明確注明 lazy 屬性的 Jav
26、a 屬性和集合類(lèi),Hibernate 會(huì)采取什么樣的默認(rèn)加載風(fēng)格。auto-import (可選-默認(rèn)為 true)指定是否可以在查詢(xún)語(yǔ)言中使用非全限定的類(lèi)名(僅限于本文件中的類(lèi))。package (可選)指定一個(gè)包前綴,如果在文檔中沒(méi)有指定全限定的類(lèi)名,就使用這個(gè)作為包名。假若你有兩個(gè)持久化類(lèi),它們的非全限定名是一樣的(就是兩個(gè)類(lèi)的名字一樣,所在的包不一樣),你應(yīng)該設(shè)置 auto-import=false。如果你把一個(gè)“import 過(guò)”的名字同時(shí)對(duì)應(yīng)兩個(gè)類(lèi),Hibernate 會(huì)拋出一個(gè)異常。282. Lazy 和 1+N 次查詢(xún)1+N 次查詢(xún)?nèi)绻O(shè)置了裝載策略為 lazy,那么可能會(huì)帶來(lái)
27、有名的 1+N 次查詢(xún),1+N 有兩種典型的體現(xiàn),一個(gè)是以 Iterator 為代表,一個(gè)是以關(guān)系為代表。以 Iterator 為代表的 1+N 次查詢(xún)1:第一次查詢(xún)的時(shí)候:如果是設(shè)置了lazy 的對(duì)象,Hibernate 會(huì)只裝載主鍵的值2:那么以后每次真正調(diào)用一個(gè)對(duì)象的時(shí)候,Hibernate 發(fā)現(xiàn)這個(gè)對(duì)象沒(méi)有值,只有主鍵,那么 Hibernate 會(huì)用主鍵做條件重新查詢(xún)一次。3:設(shè)若 N 條后來(lái)都了,那么總的查詢(xún)次數(shù)就是 1+N 次以關(guān)系為代表的 1+N 次查詢(xún)1:第一次查詢(xún)出有N 條 Parent 對(duì)象2:當(dāng)每個(gè) Parent 對(duì)象里面的 Child 對(duì)象或 Child 對(duì)象集合的時(shí)候
28、,會(huì)重新用一條sql 去Child 對(duì)象。3:設(shè)若 N 條 Parent 對(duì)象都了里面的 Child,那么總的查詢(xún)次數(shù)就是 1+N 次3. Class 元素元素使用 class 元素來(lái)定義一個(gè)持久化類(lèi):name (可選):持久化類(lèi)(或者接口)的 Java 全限定名。如果這個(gè)屬性不存在,Hibernate 將假定這是一個(gè)非 POJO 的實(shí)體。若指明的持久化類(lèi)實(shí)際上是一個(gè)接口,這也是可以的,可以用元素來(lái)指定該接口的實(shí)際實(shí)現(xiàn)類(lèi)。table (可選-默認(rèn)是類(lèi)的非全限定名)對(duì)應(yīng)的數(shù)據(jù)庫(kù)表名。discriminator-value (可選- 默認(rèn)和類(lèi)名一樣)一個(gè)用于區(qū)分不同的子類(lèi)的值,在多態(tài)行為時(shí)使用。它
29、可以接受的值包括 null 和not null30mutable (可選,默認(rèn)值為 true)表明該類(lèi)的實(shí)例是可變的或者不可變的。不可變類(lèi),mutable=false不可以被應(yīng)用程序更新或者刪除。schema (optional)覆蓋在根元素中指定的 schema。catalog (optional)覆蓋在根元素中指定的 xy (可選)指定一個(gè)接口,在延遲裝載時(shí)作為使用??蛇x的 proxy 屬性允許延遲加載類(lèi)的持久化實(shí)例。Hibernate 開(kāi)始會(huì)返回實(shí)現(xiàn)了這個(gè)命名接口的 CGLIB。當(dāng)?shù)哪硞€(gè)方法被實(shí)際調(diào)用的時(shí)候,真實(shí)的持久化對(duì)象才會(huì)被裝載。dynamic-update
30、(可選, 默認(rèn)為 false)指定用于 UPDATE 的 SQL 將會(huì)在運(yùn)行時(shí)動(dòng)態(tài)生成,并且只更新那些改變過(guò)的字段。dynamic-insert (可選, 默認(rèn)為 false)。指定用于 INSERT 的 SQL 將會(huì)在運(yùn)行時(shí)動(dòng)態(tài)生成,并且只包含那些非空值字段select-before-update (可選, 默認(rèn)為 false)。指定 Hibernate 除非確定對(duì)象真正被修改了,否則不會(huì)執(zhí)行 SQL UPDATE 操作。在特定場(chǎng)合(實(shí)際上,它只在一個(gè)瞬時(shí)對(duì)象(transient object)關(guān)聯(lián)到一個(gè)新的 ses中時(shí)執(zhí)行的update()中生效),這說(shuō)明 Hibernate 會(huì)在 UPD
31、ATE 之前執(zhí)行一次額外的 SQL SELECT 操作,來(lái)決定是否應(yīng)該執(zhí)行 UPDATE。使用 select-before-update 通常會(huì)降低性能。31polymorphism(多態(tài))(可選, 默認(rèn)值為 implicit (隱式) )界定是隱式還是顯式的使用多態(tài)查詢(xún),這只在 Hibernate 的具體表繼承策略中用到。Implicit 隱式多態(tài)是指:如果查詢(xún)時(shí)給出的是任何超類(lèi)、該類(lèi)實(shí)現(xiàn)的接口或者該類(lèi)的名字,都會(huì)返回這個(gè)類(lèi)的實(shí)例;如果查詢(xún)中給出的是子類(lèi)的名字,則會(huì)返回子類(lèi)的實(shí)例。 Explicit顯式多態(tài)是指:只有在查詢(xún)時(shí)給出明確的該類(lèi)名字時(shí)才會(huì)返回這個(gè)類(lèi)的實(shí)例;同時(shí)只有在這個(gè)的定義中作為
32、 或者出現(xiàn)的子類(lèi),才可能被返回。在大多數(shù)情況下,默認(rèn)的 polymorphism=implicit都是合適的。where (可選)指定一個(gè)附加的 SQLWHERE 條件,在抓取這個(gè)類(lèi)的對(duì)象時(shí)會(huì)一直增加這個(gè)條件。persister(可選)指定一個(gè)定制的 Class Persister。batch-size (可選,默認(rèn)是 1)指定一個(gè)用于根據(jù)標(biāo)識(shí)符(identifier)抓取實(shí)例時(shí)使用的“batch size”(批次抓取數(shù)量)optimistic-lock(樂(lè)觀鎖定)(可選,默認(rèn) ver)。決定樂(lè)觀鎖定的策略。如果你打開(kāi)了 dynamic-update,你可以選擇幾種樂(lè)觀鎖定的策略:1)ver(
33、版本檢查)檢查ver/timest字段2)all(全部)檢查全部字段3)dirty(臟檢查)只修改過(guò)的字段4)none(查)不使用樂(lè)觀鎖定非常強(qiáng)烈建議你在 Hibernate 中使用 ver/timest字段來(lái)進(jìn)行樂(lè)觀鎖定。對(duì)性能來(lái)說(shuō),這是最好的選擇,并且這也是唯一能夠處理在 ses行操作的策略。32lazy (可選)延遲加載(Lazy fetching)。entity-name (可選,默認(rèn)為類(lèi)名)Hibernate4 允許一個(gè)類(lèi)進(jìn)行多次(前提是到不同的表),并且允許使用 Maps或 XML 代替 Java 層次的實(shí)體(也就是實(shí)現(xiàn)動(dòng)態(tài)領(lǐng)域模型,不用寫(xiě)持久化類(lèi))。check (可選)這是一個(gè)
34、SQL 表達(dá)式,用于為自動(dòng)生成的 schema 添加多行約束檢查。rowid(可選)Hibernate 可以使用數(shù)據(jù)庫(kù)支持的所謂的 ROWIDs,例如:Oracle 數(shù)據(jù)庫(kù),如果你設(shè)置這個(gè)可選的 rowid,Hibernate 可以使用額外的字段 rowid 實(shí)現(xiàn)快速更新。subselect(可選)它將一個(gè)不可變(immutable)并且只讀的實(shí)體到一個(gè)數(shù)據(jù)庫(kù)的子查詢(xún)中。當(dāng)你想用視圖代替一張基本表的時(shí)候,這是有用的,但最好不要這樣做。abstract (可選)用于在的繼承結(jié)構(gòu)中標(biāo)識(shí)抽象超類(lèi)4. 多次一個(gè)類(lèi)如果想要多次同一個(gè)類(lèi),可以采用如下的方式:對(duì)特定的持久化類(lèi),多次是允許的。這種情形下,你必
35、須指定 entity name 來(lái)區(qū)別同實(shí)體的對(duì)象實(shí)例。默認(rèn)情況下,實(shí)體名字和類(lèi)名是相同的。Hibernate 在操作持久化對(duì)象、編寫(xiě)查詢(xún)條件,或者把關(guān)聯(lián)到指定實(shí)體時(shí),允許你指定這個(gè) entity name(實(shí)體名字)。335. Ver元素配置元素 元素是可選的,表明表中包含附帶版本信息的數(shù)據(jù)。column(可選默認(rèn)為屬性名)指定持有版本號(hào)的字段名。name持久化類(lèi)的屬性名。type(可選默認(rèn)是eger)版本號(hào)的類(lèi)型。acs(可選默認(rèn)為 property)Hibernate 用來(lái)屬性值的策略。unsaved-value(可選默認(rèn)是 undefined)用于標(biāo)明某個(gè)實(shí)例是剛剛被實(shí)例化的(尚未保存
36、)版本屬性值,依靠這個(gè)值就可以把這34種情況和已經(jīng)在先前的 ses中保存或裝載的脫管(detached)實(shí)例區(qū)分開(kāi)來(lái)。(undefined指明應(yīng)被使用的標(biāo)識(shí)屬性值。)generated(可選默認(rèn)是 never)表明此版本屬性值是否實(shí)際上是由數(shù)據(jù)庫(kù)生成的。insert(可選默認(rèn)是 true)表明此版本列應(yīng)該包含在 SQL語(yǔ)句中。只有當(dāng)數(shù)據(jù)庫(kù)字段有默認(rèn)值 0 的時(shí)候,才可以設(shè)置為 false。6. 樂(lè)觀鎖(1)首先在數(shù)據(jù)庫(kù)表中添加一個(gè)字段:ver,類(lèi)型為number(2)在 UserM里面添加一個(gè)字段:ver,類(lèi)型為,也要對(duì)應(yīng)的 getter 和 setter 方法。(3)在 UserMhbm.x
37、ml 中添加配置如下:35(4)然后把數(shù)據(jù)庫(kù)tbl_user 中的數(shù)據(jù)全部清除掉,這樣好觀察數(shù)據(jù)變化(5)運(yùn)行原來(lái)的 cnt,在數(shù)據(jù)庫(kù)中生成一條數(shù)據(jù),值是:uuid=1,userId=id1,name=name1,age=1,ver=0(6)注意:ver字段為 Hibernate 自己,程序中不需要操作這個(gè)字段(7)然后寫(xiě)新的客戶(hù)端進(jìn)試,如下:36import.hibernate.Ses;import.hibernate.SesFactory; import.hibernate.Tranion; import.hibernate.cfg.Configuration; public class
38、C nt public s ic void main(String args) SesFactory sf= new Configuration().configure().buildSesFactory(); Sesses1 = null;Sesses2 = null; try/ 有使用者 1 開(kāi)啟了一個(gè) ses1ses1 = sf.openSes();/ 在這之后,馬上有另一個(gè)使用者 2 開(kāi)啟了 ses2 ses2 = sf.openSes();/ 使用者 1 查詢(xún)數(shù)據(jù)UserMuserV1 = (UserM) ses1.load(UserM.class, 1);/ 使用者 2 查詢(xún)同一條
39、數(shù)據(jù)UserMuserV2 = (UserM) ses2.load(UserM.class, 1);/ 此時(shí)兩個(gè)版本號(hào)是相同的System.out.prln(v1=+ userV1.getVer() + ,v2=+ userV2.getVer(); Tranion tx1 = ses1.begranion();Tranion tx2 = ses2.begranion();/ 使用者 1 更新數(shù)據(jù)userV1.setAge(111); mit();/ 此時(shí)由于數(shù)據(jù)更新,數(shù)據(jù)庫(kù)中的版本號(hào)遞增了/ 兩筆數(shù)據(jù)版本號(hào)不一樣了System.out.prln(v1=+userV1.getVer()+,v2=
40、+ userV2.getVer();/ userV2 的 age 數(shù)據(jù)還是舊的/ 數(shù)據(jù)更新userV2.setName(vertest);/ 因版本號(hào)比數(shù)據(jù)庫(kù)中的舊/ 修改會(huì)失敗,拋出 StableObjectS eException 例外mit(); catch(Exception err ) err.prStackTrace();7. Id 元素被的類(lèi)必須定義對(duì)應(yīng)數(shù)據(jù)庫(kù)表主鍵字段。大多數(shù)類(lèi)有一個(gè) JavaBeans 風(fēng)格的屬性,為每一個(gè)實(shí)例包含唯一的標(biāo)識(shí)。 元素定義了該屬性到數(shù)據(jù)庫(kù)表主鍵字段的。 (5)name (可選)標(biāo)識(shí)屬性的名字。type (可選)標(biāo)識(shí) Hibernate 類(lèi)型的名字
41、。column (可選-默認(rèn)為屬性名)主鍵字段的名字。unsaved-value (可選-默認(rèn)為一個(gè)切合實(shí)際(sensible)的值)一個(gè)特定的標(biāo)識(shí)屬性值,用來(lái)標(biāo)志該實(shí)例是剛剛創(chuàng)建的,尚未保存。unsaved-value屬性在 Hibernate4 中幾乎不再需要。37 finally ses1.close();ses2.close();acs (可選-默認(rèn)為 property)Hibernate 用來(lái)屬性值得策略。8. Hibernate 的類(lèi)型Hibernate 在進(jìn)行的時(shí)候,既不使用 Java 的類(lèi)型,也不使用數(shù)據(jù)庫(kù)的類(lèi)型,而是使用自己提供的類(lèi)型,Hibernate 提供大量的內(nèi)建類(lèi)型,
42、也支持自定義類(lèi)型。(1)Hibernate 的內(nèi)建類(lèi)型內(nèi)置的 basic maptypes 可以大致地分類(lèi)為:1) eger, long, short, float, double, character, byte, yes_no, true_false這些類(lèi)型都對(duì)應(yīng) Java 的原始類(lèi)型或其封裝類(lèi),來(lái)符合特定廠商的 SQL 字段類(lèi)型。2),yes_no 和 true_false是 Java 中或者的另外說(shuō)法。3)string從 java.lang.String 到 VARCHAR(或者 Oracle 的 VARCHAR2)的。4)date, time, timest從 java.util.D
43、ate 和其子類(lèi)到 SQL 類(lèi)型 DATE,TIME 和 TIMEST(或等價(jià)類(lèi)型)的。5)calendar, calendar_date從 java.util.Calendar 到 SQL 類(lèi)型 TIMEST和 DATE(或等價(jià)類(lèi)型)的。6)big_decimal, big_eger從java.math.BigDecimal 和java.math.Bigeger 到NUMERIC(或者 Oracle 的NUMBER類(lèi)型)的。7)locale, timezone, currency從java.util.Locale,java.util.TimeZone 和java.util.Currency
44、到VARCHAR(或者Oracle 的VARCHAR2 類(lèi)型)的。Locale 和 Currency 的實(shí)例被為它們的 ISO 代碼。TimeZone 的實(shí)例被影射為它的 ID。8)class從 java.lang.Class 到 VARCHAR(或者 Oracle 的 VARCHAR2 類(lèi)型)的。Class 被38為它的全限定名。9)binary把字節(jié)數(shù)組(byte arrays)為對(duì)應(yīng)的 SQL 二進(jìn)制類(lèi)型。10)text把長(zhǎng) Java 字符串為 SQL 的 CLOB 或者 TEXT 類(lèi)型。11)serializable把可序列化的 Java 類(lèi)型到對(duì)應(yīng)的 SQL 二進(jìn)制類(lèi)型。你也可以為一
45、個(gè)并非默認(rèn)為基本類(lèi)型的可序列化 Java 類(lèi)或者接口指定 Hibernate 類(lèi)型serializable。12)clob, blobJDBC 類(lèi) java.sql.Clob 和 java.sql.Blob 的。某些程序可能不適合使用這個(gè)類(lèi)型,因?yàn)?blob 和 clob 對(duì)象可能在一個(gè)事務(wù)之外是無(wú)法重用的。(而且, 驅(qū)動(dòng)程序?qū)@種類(lèi)型的支持充滿著補(bǔ)丁和前后。)13)imm_date, imm_time, imm_timest, imm_calendar, imm_calendar_date, imm_serializable,imm_binary一般來(lái)說(shuō),類(lèi)型被假定為是可變的 Java 類(lèi)型
46、,只有對(duì)不可變 Java 類(lèi)型,Hibernate會(huì)采取特定的優(yōu)化措施,應(yīng)用程序會(huì)把這些對(duì)象作為不可變對(duì)象處理。比如,你不應(yīng)該對(duì)作為 imm_timest的 Date 執(zhí)行 Date.setTime()。要改變屬性的值,并且保存這一改變,應(yīng)用程序必須對(duì)這一屬性重新設(shè)置一個(gè)新的(不一樣的)對(duì)象。在.hibernate.Hibernate中,定義了基礎(chǔ)類(lèi)型對(duì)應(yīng)的 Type 常量。比如,Hibernate.STRING 代表string 類(lèi)型。9. comite-id 元素如果表使用聯(lián)合主鍵,你可以類(lèi)的多個(gè)屬性為標(biāo)識(shí)符屬性。這種做法現(xiàn)在是非常不的,但可能有些遺留系統(tǒng)使用了雙主鍵或多主鍵。配置如下示例
47、:就表示是一個(gè)雙主鍵,由 name 和deptment 聯(lián)合來(lái)做主鍵使用Comite-id 元素的時(shí)候,39你的持久化類(lèi)必須覆蓋 equals() 和 hashCode()方法,來(lái)實(shí)現(xiàn)組合的標(biāo)識(shí)符的相等判斷。實(shí)現(xiàn)Serializable 接口也是必須的。10.Generator 元素可選的子元素是一個(gè) Java 類(lèi)的名字,用來(lái)為該持久化類(lèi)的實(shí)例生成唯一的標(biāo)識(shí)。如果這個(gè)實(shí)例需要某些配置值或者初始化參數(shù),用元素來(lái)傳遞。如下示例:_id_sequence下面是一些 Hibernate 內(nèi)置:increment用于為 long, short 或者類(lèi)型生成唯一標(biāo)識(shí)。只有在沒(méi)有其他進(jìn)程往同一數(shù)據(jù)時(shí)才能使用
48、。在集群下不要使用。identity對(duì) DB2, MS SQL Server, Sybase 和 HyicSQL 的內(nèi)置標(biāo)識(shí)字段提供支持。返回的標(biāo)識(shí)符是 long, short 或者類(lèi)型的。Sequence在 DB2,tgreSQL, Oracle, SAP DB, McKoi 中使用 sequence,而在erbase 中使用(generator)。返回的標(biāo)識(shí)符是 long, short 或類(lèi)型的。hilo使用一個(gè)高/低位算法高效的生成 long, short 或者類(lèi)型的標(biāo)識(shí)符。給定一個(gè)表和字段(默認(rèn)分別是 hibernate_unique_key 和 next_hi)作為值的來(lái)源。高/低位
49、算法生成的標(biāo)識(shí)符只在一個(gè)特定的數(shù)據(jù)庫(kù)中是唯一的。Seqhilo使用一個(gè)高/低位算法來(lái)高效的生成 long, short 或者類(lèi)型的標(biāo)識(shí)符,給定一個(gè)數(shù)據(jù)庫(kù)序列(sequence)的名字。40Uuid用一個(gè) 128-bit 的 UUID 算法生成字符串類(lèi)型的標(biāo)識(shí)符,這在一個(gè)網(wǎng)絡(luò)中是唯一的(使用了 IP 地址)。UUID 被編碼為一個(gè) 32 位 16 進(jìn)制數(shù)字的字符串。guid在 MS SQL Server 和中使用數(shù)據(jù)庫(kù)生成的 GUID 字符串。native根據(jù)底層數(shù)據(jù)庫(kù)的能力選擇 identity, sequence 或者h(yuǎn)ilo 中的一個(gè)。Assigned讓?xiě)?yīng)用程序在 save()之前為對(duì)象分
50、配一個(gè)標(biāo)示符。這是元素沒(méi)有指定時(shí)的默認(rèn)生成策略。select通過(guò)數(shù)據(jù)庫(kù)觸發(fā)器選擇一些唯一主鍵的行并返回主鍵值來(lái)分配一個(gè)主鍵。foreign使用另外一個(gè)相關(guān)聯(lián)的對(duì)象的標(biāo)識(shí)符。通常和使用。使用 UUIDUUID 包含:IP 地址、JVM 的啟動(dòng)時(shí)間(精確到 1/4 秒)、系統(tǒng)時(shí)間和一個(gè)計(jì)數(shù)器值(在 JVM 中唯一)。11. Property 元素元素為類(lèi)定義了一個(gè)持久化的,JavaBean 風(fēng)格的屬性。name屬性的名字,以小寫(xiě)字母開(kāi)頭column (可選- 默認(rèn)為屬性名字)對(duì)應(yīng)的數(shù)據(jù)庫(kù)字段名。也可以通過(guò)嵌套的元素指定。type (可選)一個(gè) Hibernate 類(lèi)型的名字。typename 可以
51、是如下幾種:A:Hibernate 基本類(lèi)型名(比如: eger, string, character,date, timest, float, binary,serializable, object, blob)。B :一個(gè) Java 類(lèi)的名字,這個(gè)類(lèi)屬于一種默認(rèn)基礎(chǔ)類(lèi)型( 比如: , float,char,java.lang.String, java.util.Date, java.lang.eger, java.sql.Clob)。C:一個(gè)可以序列化的 Java 類(lèi)的名字。D:一個(gè)自定義類(lèi)型的類(lèi)的名字。(比如:cn.javass.type.MyCustomType)。如果你沒(méi)有指定類(lèi)型,
52、Hibernarte 會(huì)使用反射來(lái)得到這個(gè)名字的屬性,以此來(lái)猜測(cè)正確的 Hibernate 類(lèi)型。Hibernate 會(huì)按照規(guī)則 B,C,D 的順序?qū)傩云?getter 方法)的返回類(lèi)進(jìn)行解釋。然而,這還不夠。在某些情況下你仍然需要 type 屬性。(比如,為了區(qū)別Hibernate.DATE 和 Hibernate.TIMEST或者為了指定一個(gè)自定義類(lèi)型。)update, insert (可選-默認(rèn)為 true)表明用于 UPDATE 和/或 INSERT 的 SQL 語(yǔ)句中是否包含這個(gè)被了的字段。這二者如果都設(shè)置為 false 則表明這是一個(gè)“外源性(derived)”的屬性,它的值來(lái)源
53、于42到同一個(gè)(或多個(gè))字段的某些其他屬性,或者通過(guò)一個(gè) trigger(觸發(fā)器)或其他程序生成。formula (可選)一個(gè) SQL 表達(dá)式,定義了這個(gè)計(jì)算屬性的值。計(jì)算屬性沒(méi)有和它對(duì)應(yīng)的數(shù)據(jù)庫(kù)字段,相當(dāng)于是一個(gè)子查詢(xún)。acs (可選默認(rèn)值 property)Hibernate屬性值的策略 acs 屬性用來(lái)讓你控制 Hibernate 如何在運(yùn)行時(shí)屬性。在默認(rèn)情況下, Hibernate 會(huì)使用屬性的 get/set 方法對(duì)。如果你指明 acs=field,Hibernate 會(huì)忽略 get/set 方法對(duì),直接使用反射來(lái)成員變量。你也可以指定你自己的策略,這就需要你自己實(shí)現(xiàn).perty.P
54、ropertyAcsor 接口,再在 acs 中設(shè)置你自定義策略類(lèi)的名字。lazy (可選- 默認(rèn)為 false)指定指定實(shí)例變量第一次被時(shí),這個(gè)屬性是否延遲抓取(fetched lazily)(需要運(yùn)行時(shí)字節(jié)碼增強(qiáng))。unique (可選)使用 DDL 為該字段添加唯一的約束。同樣,允許它作為 property-ref的目標(biāo)。not-null (可選)使用 DDL 為該字段添加可否為空(nullability)的約束。optimistic-lock (可選- 默認(rèn)為 true)指定這個(gè)屬性在做更新時(shí)是否需要獲得樂(lè)觀鎖定(optimistic lock)。換句話說(shuō),它決定這個(gè)屬性發(fā)生臟數(shù)據(jù)時(shí)版
55、本(ver)的值是否增長(zhǎng)。43generated (可選默認(rèn)值 never)表明此屬性值是否由數(shù)據(jù)庫(kù)生成12.組件元素 元素把子對(duì)象的一些元素與父類(lèi)對(duì)應(yīng)的表的一些字段起來(lái)。然后組件可以定義它們自己的屬性、組件或者集合。Name屬性名。class(可選默認(rèn)為通過(guò)反射得到的屬性類(lèi)型)組件(子)類(lèi)的名字。44Insert被的字段是否出現(xiàn)在 SQL 的 INSERT 語(yǔ)句中?Update被的字段是否出現(xiàn)在 SQL 的 UPDATE 語(yǔ)句中?acs(可選默認(rèn)為 property)Hibernate 用來(lái)屬性值的策略。lazy(可選默認(rèn)是 false)表明此組件應(yīng)在實(shí)例變量第一次被的時(shí)候延遲加載(需要編譯
56、時(shí)字節(jié)碼裝置器)。optimistic-lock(可選默認(rèn)是 true)表明更新此組件是否需要獲取樂(lè)觀鎖。換句話說(shuō),當(dāng)這個(gè)屬性變臟時(shí),是否增加版本號(hào)(Ver)。unique(可選默認(rèn)是 false)表明組件的所有字段上都有唯一性約束。其 子為子類(lèi)的一些屬性與表字段之間建立。組件(Component)是一個(gè)被包含的對(duì)象,在持久化的過(guò)程中,它被當(dāng)作值類(lèi)型,而并非一個(gè)實(shí)體的,指的是對(duì)象的。使用示例如下:1:新建一個(gè)M,包含字段:userId 和 name2:修改 UserM,在里面去掉 userId 和 name,然后添加一個(gè)字段:p,類(lèi)型為M,也要對(duì)應(yīng)的 getter 和 setter 方法3:在
57、UserM.hbm.xml 中修改配置如下:454:相應(yīng)的修改Cnt 文件如下:/準(zhǔn)備數(shù)據(jù)UserMum = new UserM();um.setUuid(13);um.setAge(1);Mpm = newM();pm.setUserId(id1);pm.setName(name1);um.setP(pm);13.join 元素元素,使用元素,假若在表之間存在一對(duì)一關(guān)聯(lián),可以將一個(gè)類(lèi)的屬性映射到多。46Table被連接表的名稱(chēng)。schema(可選)覆蓋在根 元素中指定的 schema 名字。catalog(可選)覆蓋在根 元素中指定的 catalog 名字。fetch(可選默認(rèn)是 join)
58、如果設(shè)置為默認(rèn)值 join,Hibernate 將使用一個(gè)內(nèi)連接來(lái)得到這個(gè)類(lèi)或其超類(lèi)定義的,而使用一個(gè)外連接來(lái)得到其子類(lèi)定義的。如果設(shè)置為 select,則 Hibernate 將為子類(lèi)定義的 使用順序選擇。這僅在一行數(shù)據(jù)表示一個(gè)子類(lèi)的對(duì)象的時(shí)候才會(huì)發(fā)生。對(duì)這個(gè)類(lèi)和其超類(lèi)定義的,依然會(huì)使用內(nèi)連接得到。inverse(可選默認(rèn)是 false)如果打開(kāi),Hibernate 不會(huì)或者更新此連接定義的屬性。optional(可選默認(rèn)是 false)如果打開(kāi),Hibernate 只會(huì)在此連接定義的屬性非空時(shí)一行數(shù)據(jù),并且總是使用一個(gè)外連接來(lái)得到這些屬性。)的地址(address)信息可以被例如,一個(gè)人(
59、到單獨(dú)的表中(并保留所有屬性的值類(lèi)型語(yǔ)義):.此特性常常對(duì)遺留數(shù)據(jù)模型有用14.properties 元素允許定義一個(gè)命名的邏輯分組(grou)包含一個(gè)類(lèi)中的多個(gè)屬性。這個(gè)元素最重要的用處是允許多個(gè)屬性的組合作為 property-ref的目標(biāo)()。這也是定義字段唯一約束的便途徑?;径x如下48Name分組的邏輯名稱(chēng)不是實(shí)際屬性的名稱(chēng)。Insert被的字段是否出現(xiàn)在 SQL 的 INSERT 語(yǔ)句中update被的字段是否出現(xiàn)在 SQL 的 UPDATE 語(yǔ)句中optimistic-lock(可選默認(rèn)是 true)表明更新此組件是否需要獲取樂(lè)觀鎖。換句話說(shuō),當(dāng)這個(gè)屬性變臟時(shí),是否增加版本號(hào)(
60、Ver)。unique(可選默認(rèn) false)表明組件的所有字段上都有唯一性約束。元素的簡(jiǎn)單示例在其他元素里面,就可以使用屬性參照來(lái)了,如 property-ref=name4915.其他配置與對(duì)象繼承相關(guān)的配置鑒別器(discriminator)、子類(lèi)、連接的子類(lèi)、聯(lián)合子類(lèi)、連接、Any 元素與關(guān)系相關(guān)的配置多對(duì)一(many-to-one)、一對(duì)一(one-to-one)、key與 ver類(lèi)似的 times同樣用在樂(lè)觀鎖的配置上,作為版本的替代。時(shí)間戳本質(zhì)上是一種對(duì)樂(lè)觀鎖定的一種不是特別安全的實(shí)現(xiàn),并不使用。自然 ID(natural-id)在元素中列出自然鍵的屬性。Hibernate 會(huì)幫
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年數(shù)字化考試中心系統(tǒng)項(xiàng)目可行性研究報(bào)告
- 2024至2030年中國(guó)潔凈型三足式上部卸料離心機(jī)行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2024至2030年中國(guó)不銹鋼頭框平床行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2024年中國(guó)隔膜式壓縮機(jī)市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)鋼鐵中溫磷化液市場(chǎng)調(diào)查研究報(bào)告
- 2024年手焊條項(xiàng)目可行性研究報(bào)告
- 2024年中國(guó)自動(dòng)雙頭中心孔研磨機(jī)市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)浮動(dòng)床軟化設(shè)備市場(chǎng)調(diào)查研究報(bào)告
- 中國(guó)新材料產(chǎn)業(yè)發(fā)展報(bào)告
- 青海大學(xué)《云南地理》2023-2024學(xué)年第一學(xué)期期末試卷
- 康復(fù)科學(xué)科建設(shè)規(guī)劃
- 《薪酬福利管理制度》課件
- 儲(chǔ)能技術(shù) 習(xí)題答案匯總 (梅生偉)第1-9章
- 《李憑箜篌引》 統(tǒng)編版高中語(yǔ)文選擇性必修中冊(cè)
- 物業(yè)服務(wù)前置方案
- 智慧樹(shù)知到《艾滋病性與健康》見(jiàn)面課答案
- 新能源汽車(chē)技術(shù)職業(yè)生涯人物訪談報(bào)告
- 市政工程安全文明施工措施費(fèi)提取和使用計(jì)劃
- 15D501 建筑物防雷設(shè)施安裝
- 表C.1.1 工程概況表(例)
- 銀行消費(fèi)者權(quán)益保護(hù)工作報(bào)告范文(通用3篇)
評(píng)論
0/150
提交評(píng)論