首先補充一點:hibernate支持JNDI、JDBC、JTA接口,其中JDBC是本地事務(wù),即只對比如MySQL中的一個數(shù)據(jù)庫起作用,而JTA是全局事務(wù),如對MySQL中的兩個數(shù)據(jù)庫aa和bb都起作用。
一、hibernate的標(biāo)簽
1.1hibernate基本映射
實體類<-->表
實體類中的普通屬性<-->表字段
采用<class>標(biāo)簽進(jìn)行映射成數(shù)據(jù)庫表,通過<property>標(biāo)簽將普通屬性(即一些數(shù)組、集合等)映射成表字段
- auto-import,package屬性:
在Query query = session.createQuery("from User");中如果我們將屬性auto-import設(shè)置為false,則User必須加上完整的包名,當(dāng)然默認(rèn)是true,即自動導(dǎo)入。在User.hbm.xml中如果我們在<hibernate-mapping>中加上package="cn.itcast.hibernate",則后面的class標(biāo)簽中就不需要加包名了。
如:
<hibernate-mapping package="cn.itcast.model">
<class name="User" table="_user">
<id name="id" length="36"></id>
<property name="name" unique="true" not-null="true" length="20"></property>
<property name="password" not-null="true" length="10"></property>
<property name="createTime"></property>
<property name="expireTime"></property>
</class>
</hibernate-mapping>
table 屬性:
在實體類中實體名是User,當(dāng)我們不指定table時默認(rèn)表明也是User,但是我們也可以使用table標(biāo)簽指定表名<class name="User" table="_user">dynamic-update 和 dynamic-insert 屬性:
第一個屬性如果設(shè)置為false則在我們使用updata操作的時候它只發(fā)出變化字段的sql語句。但是這樣做也有缺點,因為如果一條語句沒有變化,那么這條語句就不能執(zhí)行,比如我們之前可以多次運行testSave方法生成同樣的數(shù)據(jù),但是只有主鍵不一樣,如果設(shè)置了第一個屬性為false,那么就不行了。第二條語句類似。id 標(biāo)簽:
這里表示的是單一主鍵,如果有多個主鍵,那么就需要使用復(fù)合主鍵了,以后再說。name屬性
指定類中的屬性,默認(rèn)是字段名,可以使用column進(jìn)行重命名字段名。type屬性
默認(rèn)會將String轉(zhuǎn)換為數(shù)據(jù)庫中的varchar,將Java中的Date轉(zhuǎn)換為數(shù)據(jù)庫中的日期類型。我們也可以使用此屬性指定轉(zhuǎn)換的類型。lenth屬性
默認(rèn)String轉(zhuǎn)換為varchar是255,但是這里我們可以使用此屬性指定長度。
1.2 generator 標(biāo)簽
在Hibernate中主鍵必須配置生成策略。生成策略有increment、identity、sequence。
increment表示可以自增,從一開始。自增在本數(shù)據(jù)庫中是不會重復(fù)的,但是在數(shù)據(jù)庫集群中很可能會產(chǎn)生重復(fù)。
identity表示使用數(shù)據(jù)庫系統(tǒng)(如mysql)的自增,但是如果換成Orecla的話就會出現(xiàn)問題。如果是Orecla則需要配置為sequence屬性。同時如果設(shè)置為identity的話則id必須是數(shù)值型,不能是String。
編碼類型
uuid:這是很常用的。是一個32位的字符串,是Hibernate生成的,一般是不會重復(fù)的。一般我們給出長度為36。
guid:在mysql和sql Server中使用,
native:也表示自增,但是會根據(jù)數(shù)據(jù)庫的類型選擇identity或sequence。
assigned:讓應(yīng)用程序在save之前為對象分配一個標(biāo)識符。這樣需要手動生成主鍵。即手動給主鍵一個值。說明:一般我們都選擇手動生成主鍵,即使用assigned。
1.3 property 標(biāo)簽:
- column和上面的類似。
- unique屬性:設(shè)置唯一性,即不允許重復(fù)。
- not-null屬性:非空設(shè)置。
- length:長度
1.4 注意
類名不能是數(shù)據(jù)庫中的關(guān)鍵字。同時類中的屬性也不能和數(shù)據(jù)庫中的關(guān)鍵字重名。
實體類的設(shè)計原則
必須要有一個無參的構(gòu)造方法。
提供一個標(biāo)識屬性(identifier property)(可選)
使用非final的類(可選)
為持久化字段聲明訪問器(accessors)。
生成getter和setter方法。(可選)我們每次在運行
ExportDB.java這個類的時候都會重建表,會將之前的數(shù)據(jù)清掉。這里我們?nèi)绻赶蜃兏兓说臄?shù)據(jù),則需要配置一個屬性(在Hibernate的配置文件中)<property name="hibernate.hbm2ddl.auto">update</property>。如果沒有發(fā)生改變則不會進(jìn)行重建。