Hibernate配置文件详解

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

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » Hibernate配置文件详解

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡