Hibernate配置文件詳解
來(lái)源:程序員人生 發(fā)布時(shí)間:2016-06-12 08:26:18 閱讀次數(shù):3368次
Hibernate的基本配置文件有兩種:hibernate.cfg.xml和model.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)