日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Hibernate配置文件詳解

Hibernate配置文件詳解

來源:程序員人生   發布時間:2016-06-12 08:26:18 閱讀次數:3375次

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


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

model.hbm.xml包括了Hibernate的基本映照信息,即系統中每個類與其對應的數據庫表之間的關聯信息,在Hibernate工作的初始階段,這些信息通過hibernate.cfg.xml的mapping節點被加載到Configuration和SessionFactory實例。

這兩種文件信息包括了Hibernate的所有運行期參數。下面我們用詳細的例子來講明這兩種文件的基本結構和內容。

1、hibernate.cfg.xml文件:                                                                                                                                                     

<!--該文件的開頭信息,對Hibernate而言,該類文件基本都這么開頭:)--> <?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"> <!-- 正文開始 --> <hibernate-configuration> <!--下面是數據庫的基本連接信息,對1個利用來講,設置1個session-factory節點就夠了,除非我們中間使用了多個數據庫--> <session-factory> <!--用戶名 --> <property name="connection.username">root</property> <!--url信息 --> <property name="connection.url">jdbc:mysql://localhost:3306/webases</property> <!--數據庫方言信息--> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!--密碼 --> <property name="connection.password">274507</property> <!--數據庫驅動信息 --> <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的關聯關系包括了1對1、1對多、多對1和多對多等4種類型,因此,也就有分別與之對應的4種.hbm.xml文件。

下面我們就以比較經常使用的雙向“1對多”型關聯關系為例,介紹1下.hbm.xml文件的基本結構和內容。

有關Hibernate更詳細的內容,請參考相干文資料。
 該例中有兩張數據庫表:1張為“省”表,另外一張為“市”表,所用的數據庫為MySQL。2者的建表語句以下:

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對多的關系。表City通過外鍵ProvinceID與表Province進行關聯:當表Province中有記錄被刪除時,表City中相干記錄亦被刪除;當表Province中有記錄被保存或更新時,表City中相干記錄無任何變化。
     將Hibernate自帶工具Middlegen生成的Province.hbm.xml文件進行修改,內容以下:

<!--該文件的開頭信息,對Hibernate而言,該類文件基本都這么開頭:)--> <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping⑵.0.dtd"> <!-- 映照文件開始 --> <hibernate-mapping> <!-- 下面的class節點定義了Province類和對應數據庫表之間的關聯關系 --> <class name="com.xxx.hibernate.Province" table="Province"> <!-- 下面的兩個節點定義了Province類中的屬性和該類對應數據庫表中的字段之間的關聯關系,其中Guid為對應數據庫表的主鍵 --> <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節點定義了Province類和City類之間的”1對多“型關聯關系 --> <set name="cities"<!-- 集合屬性的名稱 --> lazy="true"<!-- 是不是允許延遲加載 --> inverse="true"<!-- 定義這個集合是不是為雙向關聯關系中的方向1端 --> cascade="delete"<!-- 定義有關操作是不是關聯到籽實體(此處指City類對象) --> > <key> <column name="ProvinceID" /><!-- 定義集合所對應的數據庫表的外鍵 --> </key> <one-to-many class="com.xxx.hibernate.City"<!-- 定義集合所屬的類--> /> </set> </class> </hibernate-mapping>

將Hibernate自帶工具Middlegen生成的City.hbm.xml文件進行修改,內容以下: <!--該文件的開頭信息,對Hibernate而言,該類文件基本都這么開頭:)--> <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping⑵.0.dtd"> <!-- 映照文件開始 --> <hibernate-mapping> <!-- 下面的class節點定義了City類和對應數據庫表之間的關聯關系 --> <class name="com.xxx.hibernate.City" table="City"> <!-- 下面的兩個節點定義了City類中的屬性和該類對應數據庫表中的字段之間的關聯關系,其中Guid為對應數據庫表的主鍵--> <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節點定義了Province類和City類之間的”1對多“型關聯關系 --> <many-to-one name="province"<!-- 屬性名稱 --> class="com.xxx.hibernate.Province"<!-- 屬性所屬的類 --> cascade="none"<!-- 指定哪些操作會從父對象(此處指City類對象)級聯到子對象(此處指Province類對象) --> outer-join="auto"<!-- 設置父子對象之間是不是存在外連接 --> not-null="true"<!-- 指定該屬性是不是1定為非空 --> > <column name="ProvinceID" /><!-- 定義父對象(此處指City類對象)所對應的數據庫表的外鍵 --> </many-to-one> </class> </hibernate-mapping>

多對多的雙向關聯關系(中間表)    

在多對多的關聯關系中,可拆分為兩個1對多的關聯關系,即在兩個表中間增加1個關聯表,記錄這兩個表之間的關聯關系。若拋開關聯表,則原2個表之間看不出任何的關系。

以為考試種別和考試科目為例,詳細講授在添加關聯表的情況下兩個表之間的hibernate設置。

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

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

考試種別科目關聯表
exam_sort_enum_id:integer    對應考試種別表的id
subject_id:integer           對應考試科目表的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; } }
關于映照文件:
映照文件要設置set,
name=subject 為ExamSortEnum.java文件中定義的Set對象,存儲多個Subject類型的容器。
table="EXAM_SORT_ENUM_SUBJECT" 為對應的中間表的表名,由于兩個業務表之間不能直接打交道,只能通過中間表來進行關聯。
lazy="true" 延遲加載
cascade="save-update" 級聯保存更新,若設置為all,delete,all-delete-orphans,則在刪除1個ExamSortEnum對象時,關聯的Subject對象也被刪除,而此關聯的subject對象可能被其他的為ExamSortEnum對象所援用。
<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表通過subject_id與Subject表關聯
class="model.Subject" 指定set中name=subject中寄存的是model.Subject對象。
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; } }
關于映照文件:
內容與ExamSortEnum.hbm.xml差不多,只是多了1個inverse="true",告知hibernate控制權不在此處,兩個映照文件只能設置1個。

測試類:

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(); } }
履行后的結果:
考試種別表:exam_sort_enum
id         name
3 A
4 B

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

考試種別科目關聯表
exam_sort_enum_id           subject_id
3                       3
3                       4
4                       3
4                       5



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产免费小视频 | 午夜福利一级毛片 | 在线观看黄色免费网站 | 国产精品视频久久 | 亚洲 欧美 综合 | 日韩精品在线播放 | 久久之久久 | 国产精品一区二区女厕厕 | 国产一区在线免费观看 | 欧美日韩不卡 | 精品国产一区二区在线 | 在线观看亚洲网站 | 国产青青草 | 黄色一区二区三区 | 操人网站 | 神马久久一区二区 | 插综合| 国产在线播 | 成年人在线播放 | 一区二区色 | 国产成人综合av | 韩日一区二区 | 精品久久久国产 | 黄在线播放 | 亚洲欧美第一页 | 日韩在线视频一区二区三区 | 国产精品婷婷久久久久 | 成人国产网站 | 欧美日韩视频一区二区三区 | 九九亚洲精品 | 成人性生交大片免费看视频r | 久久精品视频在线看99 | 久久精品中文 | 国产69精品久久久久777 | 丝袜诱惑中文字幕 | 亚洲精品久久久一区二区三区 | 久久精品国产99 | 黄色av网站在线免费观看 | 亚洲a网站 | 欧美一级国产 | 欧日韩不卡在线视频 |