一、hibernate.cfg.xml文件:
<!--该文件的开头信息,对Hibernate而言,该类文件基本都这么开头:)-->
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
" http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- 正文开始 -->
<hibernate-configuration>
<!--下面是数据库的基本连接信息,对一个应用来说,设置一个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>
二、.hbm.xml文件:
由于Hibernate 的关联关系包含了一对一、一对多、多对一和多对多等四种类型,因此,也就有分别与之对应的四种.hbm.xml 文件。下面我们就以比较常用的双向“ 一对多” 型关联关系为例,介绍一下.hbm.xml 文件的基本结构和内容。有关Hibernate 更详细的内容,请参考相关文资料。
该例中有两张数据库表:一张为“ 省” 表,另一张为“ 市” 表,所用的数据库为MySQL 。二者的建表语句如下:
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 表为被控方,两者之间存在双向的一对多的关系。表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-2.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类之间的”一对多“型关联关系 -->
<set
name="cities" <!-- 集合属性的名称 -->
lazy="true" <!-- 是否允许延迟加载 -->
inverse="true" <!-- 定义这个集合是否为双向关联关系中的方向一端 -->
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-2.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类之间的”一对多“型关联关系 -->
<many-to-one
name="province" <!-- 属性名称 -->
class="com.xxx.hibernate.Province" <!-- 属性所属的类 -->
cascade="none" <!-- 指定哪些操作会从父对象(此处指City类对象)级联到子对象(此处指Province类对象) -->
outer-join="auto" <!-- 设置父子对象之间是否存在外连接 -->
not-null="true" <!-- 指定该属性是否一定为非空 -->
>
<column name="ProvinceID" /> <!-- 定义父对象(此处指City类对象)所对应的数据库表的外键 -->
</many-to-one>
</class>
</hibernate-mapping>
多对多的双向关联关系(中间表)
2007-06-06 17:26
在多对多的关联关系中,可拆分为两个一对多的关联关系,即在两个表中间增加一个关联表,记录这两个表之间的关联关系。若抛开关联表,则原2个表之间看不出任何的关系。 以为考试类别和考试科目为例,详细讲解在添加关联表的情况下两个表之间的hibernate设置。
<?xml version="1.0"?> <hibernate-mapping>
package model; import java.io.Serializable; public class ExamSortEnum implements Serializable{ public Set getSubject(){ public void setId(Integer id) { public String getName() { public void setName(String name) {
映射文件要设置set,
<?xml version="1.0"?> <hibernate-mapping> Subject.java package model; import java.io.Serializable; public class Subject implements Serializable{ public Integer getId() { public void setId(Integer id) { public String getName() { public void setName(String name) {
测试类: import org.hibernate.Session; public class ExamSortEnumTest { Subject sc = new Subject(); 执行后的结果: 考试科目表:subject 考试类别科目关联表 |