多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開(kāi)源 > php教程 > Hibernate配置文件詳解

Hibernate配置文件詳解

來(lái)源:程序員人生   發(fā)布時(shí)間:2016-06-12 08:26:18 閱讀次數(shù):3368次

Hibernate的基本配置文件有兩種:hibernate.cfg.xmlmodel.hbm.xml文件。


hibernate.cfg.xml包括了Hibernate與數(shù)據(jù)庫(kù)的基本連接信息,在Hibernate工作的初始階段,這些信息被前后加載到Configuration和SessionFactory實(shí)例;

model.hbm.xml包括了Hibernate的基本映照信息,即系統(tǒng)中每個(gè)類(lèi)與其對(duì)應(yīng)的數(shù)據(jù)庫(kù)表之間的關(guān)聯(lián)信息,在Hibernate工作的初始階段,這些信息通過(guò)hibernate.cfg.xml的mapping節(jié)點(diǎn)被加載到Configuration和SessionFactory實(shí)例。

這兩種文件信息包括了Hibernate的所有運(yùn)行期參數(shù)。下面我們用詳細(xì)的例子來(lái)講明這兩種文件的基本結(jié)構(gòu)和內(nèi)容。

1、hibernate.cfg.xml文件:                                                                                                                                                     

<!--該文件的開(kāi)頭信息,對(duì)Hibernate而言,該類(lèi)文件基本都這么開(kāi)頭:)--> <?xml version='1.0' encoding='UTF⑻'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration⑶.0.dtd"> <!-- 正文開(kāi)始 --> <hibernate-configuration> <!--下面是數(shù)據(jù)庫(kù)的基本連接信息,對(duì)1個(gè)利用來(lái)講,設(shè)置1個(gè)session-factory節(jié)點(diǎn)就夠了,除非我們中間使用了多個(gè)數(shù)據(jù)庫(kù)--> <session-factory> <!--用戶名 --> <property name="connection.username">root</property> <!--url信息 --> <property name="connection.url">jdbc:mysql://localhost:3306/webases</property> <!--數(shù)據(jù)庫(kù)方言信息--> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!--密碼 --> <property name="connection.password">274507</property> <!--數(shù)據(jù)庫(kù)驅(qū)動(dòng)信息 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!--指定Hibernate映照文件路徑 --> <mapping resource="com/Hibernate/test_products.hbm.xml" /> </session-factory> </hibernate-configuration>

2、.hbm.xml文件:                                                                                                                                                                  

   由于Hibernate的關(guān)聯(lián)關(guān)系包括了1對(duì)1、1對(duì)多、多對(duì)1和多對(duì)多等4種類(lèi)型,因此,也就有分別與之對(duì)應(yīng)的4種.hbm.xml文件。

下面我們就以比較經(jīng)常使用的雙向“1對(duì)多”型關(guān)聯(lián)關(guān)系為例,介紹1下.hbm.xml文件的基本結(jié)構(gòu)和內(nèi)容。

有關(guān)Hibernate更詳細(xì)的內(nèi)容,請(qǐng)參考相干文資料。
 該例中有兩張數(shù)據(jù)庫(kù)表:1張為“省”表,另外一張為“市”表,所用的數(shù)據(jù)庫(kù)為MySQL。2者的建表語(yǔ)句以下:

CREATE TABLE IF NOT EXISTS Province( Guid INT NOT NULL AUTO_INCREMENT, Provincename VARCHAR(16) NOT NULL, PRIMARY KEY (Guid) ) TYPE=InnoDB; CREATE TABLE IF NOT EXISTS City( Guid INT NOT NULL AUTO_INCREMENT, Cityname VARCHAR(32) NOT NULL, ProvinceID INT NOT NULL, PRIMARY KEY (Guid) ) TYPE=InnoDB; ALTER TABLE City ADD CONSTRAINT CityRFProvince FOREIGN KEY (ProvinceID) REFERENCES Province (Guid) ON DELETE CASCADE ON UPDATE RESTRICT;
Province表為主控方,City表為被控方,二者之間存在雙向的1對(duì)多的關(guān)系。表City通過(guò)外鍵ProvinceID與表Province進(jìn)行關(guān)聯(lián):當(dāng)表Province中有記錄被刪除時(shí),表City中相干記錄亦被刪除;當(dāng)表Province中有記錄被保存或更新時(shí),表City中相干記錄無(wú)任何變化。
     將Hibernate自帶工具M(jìn)iddlegen生成的Province.hbm.xml文件進(jìn)行修改,內(nèi)容以下:

<!--該文件的開(kāi)頭信息,對(duì)Hibernate而言,該類(lèi)文件基本都這么開(kāi)頭:)--> <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping⑵.0.dtd"> <!-- 映照文件開(kāi)始 --> <hibernate-mapping> <!-- 下面的class節(jié)點(diǎn)定義了Province類(lèi)和對(duì)應(yīng)數(shù)據(jù)庫(kù)表之間的關(guān)聯(lián)關(guān)系 --> <class name="com.xxx.hibernate.Province" table="Province"> <!-- 下面的兩個(gè)節(jié)點(diǎn)定義了Province類(lèi)中的屬性和該類(lèi)對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的字段之間的關(guān)聯(lián)關(guān)系,其中Guid為對(duì)應(yīng)數(shù)據(jù)庫(kù)表的主鍵 --> <id name="guid"type="int"column="Guid"> <generator class="native" /> </id> <property name="provincename" type="java.lang.String" column="Provincename" not-null="true" length="16" > </property> <!-- 下面的set節(jié)點(diǎn)定義了Province類(lèi)和City類(lèi)之間的”1對(duì)多“型關(guān)聯(lián)關(guān)系 --> <set name="cities"<!-- 集合屬性的名稱(chēng) --> lazy="true"<!-- 是不是允許延遲加載 --> inverse="true"<!-- 定義這個(gè)集合是不是為雙向關(guān)聯(lián)關(guān)系中的方向1端 --> cascade="delete"<!-- 定義有關(guān)操作是不是關(guān)聯(lián)到籽實(shí)體(此處指City類(lèi)對(duì)象) --> > <key> <column name="ProvinceID" /><!-- 定義集合所對(duì)應(yīng)的數(shù)據(jù)庫(kù)表的外鍵 --> </key> <one-to-many class="com.xxx.hibernate.City"<!-- 定義集合所屬的類(lèi)--> /> </set> </class> </hibernate-mapping>

將Hibernate自帶工具M(jìn)iddlegen生成的City.hbm.xml文件進(jìn)行修改,內(nèi)容以下: <!--該文件的開(kāi)頭信息,對(duì)Hibernate而言,該類(lèi)文件基本都這么開(kāi)頭:)--> <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping⑵.0.dtd"> <!-- 映照文件開(kāi)始 --> <hibernate-mapping> <!-- 下面的class節(jié)點(diǎn)定義了City類(lèi)和對(duì)應(yīng)數(shù)據(jù)庫(kù)表之間的關(guān)聯(lián)關(guān)系 --> <class name="com.xxx.hibernate.City" table="City"> <!-- 下面的兩個(gè)節(jié)點(diǎn)定義了City類(lèi)中的屬性和該類(lèi)對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的字段之間的關(guān)聯(lián)關(guān)系,其中Guid為對(duì)應(yīng)數(shù)據(jù)庫(kù)表的主鍵--> <id name="guid" type="int" column="Guid" > <generator class="native" /> </id> <property name="cityname" type="java.lang.String" column="Cityname" not-null="true" length="32"> </property> <!-- 下面的many-to-one節(jié)點(diǎn)定義了Province類(lèi)和City類(lèi)之間的”1對(duì)多“型關(guān)聯(lián)關(guān)系 --> <many-to-one name="province"<!-- 屬性名稱(chēng) --> class="com.xxx.hibernate.Province"<!-- 屬性所屬的類(lèi) --> cascade="none"<!-- 指定哪些操作會(huì)從父對(duì)象(此處指City類(lèi)對(duì)象)級(jí)聯(lián)到子對(duì)象(此處指Province類(lèi)對(duì)象) --> outer-join="auto"<!-- 設(shè)置父子對(duì)象之間是不是存在外連接 --> not-null="true"<!-- 指定該屬性是不是1定為非空 --> > <column name="ProvinceID" /><!-- 定義父對(duì)象(此處指City類(lèi)對(duì)象)所對(duì)應(yīng)的數(shù)據(jù)庫(kù)表的外鍵 --> </many-to-one> </class> </hibernate-mapping>

多對(duì)多的雙向關(guān)聯(lián)關(guān)系(中間表)    

在多對(duì)多的關(guān)聯(lián)關(guān)系中,可拆分為兩個(gè)1對(duì)多的關(guān)聯(lián)關(guān)系,即在兩個(gè)表中間增加1個(gè)關(guān)聯(lián)表,記錄這兩個(gè)表之間的關(guān)聯(lián)關(guān)系。若拋開(kāi)關(guān)聯(lián)表,則原2個(gè)表之間看不出任何的關(guān)系。

以為考試種別和考試科目為例,詳細(xì)講授在添加關(guān)聯(lián)表的情況下兩個(gè)表之間的hibernate設(shè)置。

考試種別表:exam_sort_enum
id:integer
name:string

考試科目表:subject
id:integer
name:string

考試種別科目關(guān)聯(lián)表
exam_sort_enum_id:integer    對(duì)應(yīng)考試種別表的id
subject_id:integer           對(duì)應(yīng)考試科目表的id

ExamSortEnum.hbm.xml

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping⑶.0.dtd"> <hibernate-mapping> <class name="model.ExamSortEnum" table="EXAM_SORT_ENUM" lazy="false" > <id name="id" type="integer" column="ID" length="22" > <generator class="increment" /> </id> <property name="name" type="string" column="NAME" length="255" /> <set name="subject" table="EXAM_SORT_ENUM_SUBJECT" lazy="true" cascade="save-update"> <key column="exam_sort_enum_id"/> <many-to-many column="subject_id" class="model.Subject"/> </set> </class> </hibernate-mapping>
ExamSortEnum.java
package model; import java.io.Serializable; import java.util.HashSet; import java.util.Set; public class ExamSortEnum implements Serializable{ private static final long serialVersionUID = 1L; private Integer id; private String name; private Set subject = new HashSet(); public ExamSortEnum(){} public ExamSortEnum(Integer id){ setId(id); } public void setSubject(Set subject){ this.subject = subject; } public Set getSubject(){ return this.subject; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
關(guān)于映照文件:
映照文件要設(shè)置set,
name=subject 為ExamSortEnum.java文件中定義的Set對(duì)象,存儲(chǔ)多個(gè)Subject類(lèi)型的容器。
table="EXAM_SORT_ENUM_SUBJECT" 為對(duì)應(yīng)的中間表的表名,由于兩個(gè)業(yè)務(wù)表之間不能直接打交道,只能通過(guò)中間表來(lái)進(jìn)行關(guān)聯(lián)。
lazy="true" 延遲加載
cascade="save-update" 級(jí)聯(lián)保存更新,若設(shè)置為all,delete,all-delete-orphans,則在刪除1個(gè)ExamSortEnum對(duì)象時(shí),關(guān)聯(lián)的Subject對(duì)象也被刪除,而此關(guān)聯(lián)的subject對(duì)象可能被其他的為ExamSortEnum對(duì)象所援用。
<key column="exam_sort_enum_id"/> 指定中間表中參照為Exam_Sort_Enum表的外鍵為exam_sort_enum_id
<many-to-many>
column="subject_id" Exam_Sort_Enum表參照Subject表的外鍵為subject_id,即Exam_Sort_Enum表通過(guò)subject_id與Subject表關(guān)聯(lián)
class="model.Subject" 指定set中name=subject中寄存的是model.Subject對(duì)象。
Subject.hbm.xml

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping⑶.0.dtd"> <hibernate-mapping> <class name="model.Subject" table="SUBJECT" lazy="false" > <id name="id" type="integer" column="ID" length="22" > <generator class="increment" /> </id> <property name="name" type="string" column="NAME" length="200" /> <set name="examSortEnum" table="EXAM_SORT_ENUM_SUBJECT" lazy="true" inverse="true" cascade="save-update"> <key column="subject_id"/> <many-to-many column="exam_sort_enum_id" class="model.ExamSortEnum"/> </set> </class> </hibernate-mapping>
Subject.java
package model; import java.io.Serializable; import java.util.HashSet; import java.util.Set; public class Subject implements Serializable{ private static final long serialVersionUID = 1L; private Integer id; private String name; private Set examSortEnum = new HashSet(); public Subject(){} public Subject(Integer id){ setId(id); } public void setExamSortEnum(Set examSortEnum){ this.examSortEnum = examSortEnum; } public Set getExamSortEnum(){ return this.examSortEnum; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
關(guān)于映照文件:
內(nèi)容與ExamSortEnum.hbm.xml差不多,只是多了1個(gè)inverse="true",告知hibernate控制權(quán)不在此處,兩個(gè)映照文件只能設(shè)置1個(gè)。

測(cè)試類(lèi):

package model; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class ExamSortEnumTest { public static SessionFactory sf ; static{ try{ Configuration cfg = new Configuration().configure(); sf = cfg.buildSessionFactory(); }catch(Exception e){ e.printStackTrace(); } } public void insert1(){ Session sess = sf.openSession(); Transaction tx = sess.beginTransaction(); Subject sa = new Subject(); sa.setName("A1"); Subject sb = new Subject(); sb.setName("B1"); Subject sc = new Subject(); sc.setName("C1"); ExamSortEnum esea = new ExamSortEnum(); esea.setName("A"); esea.getSubject().add(sa); esea.getSubject().add(sc); ExamSortEnum eseb = new ExamSortEnum(); eseb.setName("B"); eseb.getSubject().add(sb); eseb.getSubject().add(sc); sess.save(esea); sess.save(eseb); tx.commit(); sess.close(); } public static void main(String[] args){ ExamSortEnumTest et = new ExamSortEnumTest(); et.insert1(); } }
履行后的結(jié)果:
考試種別表:exam_sort_enum
id         name
3 A
4 B

考試科目表:subject
id      name
3 C1
4 A1
5 B1

考試種別科目關(guān)聯(lián)表
exam_sort_enum_id           subject_id
3                       3
3                       4
4                       3
4                       5



生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 校园春色亚洲激情 | a天堂视频 | 久久国产精品二国产精品 | 日韩欧美亚洲一区二区综合 | 乱老女人一二区视频 | 亚洲日本国产 | 亚洲动漫在线观看 | 国产v精品欧美精品v日韩 | 女人18一级特级毛片免费看 | 欧美高清videos性极品 | 香蕉人人超 | 国产另类视频 | 德国free性video极品 | 成人性色生活影片 | 成人亚洲网 | 国产一区欧美 | 亚洲中字| 欧美日韩三级 | 在线视频 中文字幕 | 韩国美女爽快一级毛片黄 | 中文字幕在线观看免费视频 | 免费的黄网站 | 在线播放一区二区三区 | 国产女人成人精品视频 | 奇米影视88 | 亚洲国产成人资源在线桃色 | 国产视频一区二 | 性欧美最新另类 | 羞羞视频入口网站 | 欧美羞羞视频 | 中国美女一级看片 | 视频一区二区三区欧美日韩 | 亚洲人和日本人jzz护士 | 波多野一区 | 免费视频www | 婷婷在线成人免费观看搜索 | 3344成年站福利在线视频免费 | 成人性a激情免费视频 | 亚洲第一天堂无码专区 | 逼逼爱爱 | 国产理论视频在线观看 |