Hibernate配置文件详解

来源:互联网 发布:淘宝人生全本阅读 编辑:程序博客网 时间:2024/05/29 13:44

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的所有运行期参数。下面我们用详细的例子来说明这两种文件的基本结构和内容。

一、hibernate.cfg.xml文件:                                                                                                                                                     

[html] view plain copy
print?
  1. <!--该文件的开头信息,对Hibernate而言,该类文件基本都这么开头:)-->  
  2.      <?xml version='1.0' encoding='UTF-8'?>  
  3.      <!DOCTYPE hibernate-configuration PUBLIC  
  4.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  5.         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  6.      <!-- 正文开始 -->  
  7.      <hibernate-configuration>  
  8.      <!--下面是数据库的基本连接信息,对一个应用来说,设置一个session-factory节点就够了,除非我们中间使用了多个数据库-->  
  9.      <session-factory>  
  10.      <!--用户名 -->  
  11.      <property name="connection.username">root</property>  
  12.      <!--url信息 -->  
  13.      <property name="connection.url">jdbc:mysql://localhost:3306/webases</property>  
  14.      <!--数据库方言信息-->  
  15.      <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
  16.      <!--密码 -->  
  17.      <property name="connection.password">274507</property>  
  18.      <!--数据库驱动信息 -->  
  19.      <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
  20.      <!--指定Hibernate映射文件路径 -->  
  21.      <mapping resource="com/Hibernate/test_products.hbm.xml" />  
  22.      </session-factory>  
  23.      </hibernate-configuration>   

二、.hbm.xml文件:                                                                                                                                                                  

   由于Hibernate的关联关系包含了一对一、一对多、多对一和多对多等四种类型,因此,也就有分别与之对应的四种.hbm.xml文件。

下面我们就以比较常用的双向“一对多”型关联关系为例,介绍一下.hbm.xml文件的基本结构和内容。

有关Hibernate更详细的内容,请参考相关文资料。
 该例中有两张数据库表:一张为“省”表,另一张为“市”表,所用的数据库为MySQL。二者的建表语句如下:

[sql] view plain copy
print?
  1. CREATE TABLE IF NOT EXISTS Province(  
  2.       Guid INT  NOT NULL AUTO_INCREMENT,  
  3.       Provincename VARCHAR(16)  NOT NULL,  
  4.       PRIMARY KEY (Guid)  
  5.    )  TYPE=InnoDB;   
  6.    CREATE TABLE IF NOT EXISTS City(  
  7.       Guid  INT  NOT NULL AUTO_INCREMENT,  
  8.       Cityname VARCHAR(32)  NOT NULL,  
  9.       ProvinceID INT NOT NULL,  
  10.       PRIMARY KEY (Guid)  
  11.    )  TYPE=InnoDB;  
  12.    ALTER TABLE City ADD CONSTRAINT CityRFProvince FOREIGN KEY (ProvinceID)  
  13.    REFERENCES Province (Guid) ON DELETE CASCADE ON UPDATE RESTRICT;   
Province表为主控方,City表为被控方,两者之间存在双向的一对多的关系。表City通过外键ProvinceID与表Province进行关联:当表Province中有记录被删除时,表City中相关记录亦被删除;当表Province中有记录被保存或者更新时,表City中相关记录无任何变化。
     将Hibernate自带工具Middlegen生成的Province.hbm.xml文件进行修改,内容如下:

[html] view plain copy
print?
  1.  <!--该文件的开头信息,对Hibernate而言,该类文件基本都这么开头:)-->  
  2.  <?xml version="1.0"?>  
  3.  <!DOCTYPE hibernate-mapping PUBLIC  
  4.     "-//Hibernate/Hibernate Mapping DTD 2.0//EN"  
  5.     "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">   
  6.  <!-- 映射文件开始 -->     
  7.  <hibernate-mapping>  
  8.  <!-- 下面的class节点定义了Province类和对应数据库表之间的关联关系 -->  
  9.  <class name="com.xxx.hibernate.Province" table="Province">   
  10.  <!-- 下面的两个节点定义了Province类中的属性和该类对应数据库表中的字段之间的关联关系,其中Guid为对应数据库表的主键 -->  
  11.     <id name="guid"type="int"column="Guid">  
  12.           <generator class="native" />  
  13.     </id>  
  14.     <property name="provincename" type="java.lang.String" column="Provincename" not-null="true" length="16" >    
  15.     </property>  
  16.      <!-- 下面的set节点定义了Province类和City类之间的”一对多“型关联关系 -->  
  17.     <set  
  18.         name="cities"<!-- 集合属性的名称 -->  
  19.        lazy="true"<!-- 是否允许延迟加载 -->  
  20.        inverse="true"<!-- 定义这个集合是否为双向关联关系中的方向一端 -->  
  21.        cascade="delete"<!-- 定义有关操作是否关联到子实体(此处指City类对象) -->  
  22.       >  
  23.        <key>  
  24.            <column name="ProvinceID" /><!-- 定义集合所对应的数据库表的外键 -->  
  25.        </key>  
  26.        <one-to-many class="com.xxx.hibernate.City"/><!-- 定义集合所属的类-->  
  27.    </set>   
  28.  </class>  
  29. </hibernate-mapping>  

[html] view plain copy
print?
  1. 将Hibernate自带工具Middlegen生成的City.hbm.xml文件进行修改,内容如下:  
  2.     <!--该文件的开头信息,对Hibernate而言,该类文件基本都这么开头:)-->  
  3.     <?xml version="1.0"?>  
  4.     <!DOCTYPE hibernate-mapping PUBLIC  
  5.        "-//Hibernate/Hibernate Mapping DTD 2.0//EN"  
  6.        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">   
  7.     <!-- 映射文件开始 -->    
  8.     <hibernate-mapping>  
  9.        <!-- 下面的class节点定义了City类和对应数据库表之间的关联关系 -->  
  10.       <class name="com.xxx.hibernate.City" table="City">   
  11.         <!-- 下面的两个节点定义了City类中的属性和该类对应数据库表中的字段之间的关联关系,其中Guid为对应数据库表的主键-->  
  12.         <id name="guid" type="int" column="Guid" >  
  13.             <generator class="native" />  
  14.         </id>    
  15.         <property name="cityname" type="java.lang.String" column="Cityname" not-null="true" length="32">     
  16.         </property>  
  17.         <!-- 下面的many-to-one节点定义了Province类和City类之间的”一对多“型关联关系 -->  
  18.         <many-to-one  
  19.              name="province"<!-- 属性名称 -->  
  20.              class="com.xxx.hibernate.Province"<!-- 属性所属的类 -->  
  21.              cascade="none"<!-- 指定哪些操作会从父对象(此处指City类对象)级联到子对象(此处指Province类对象) -->  
  22.              outer-join="auto"<!-- 设置父子对象之间是否存在外连接 -->  
  23.              not-null="true"<!-- 指定该属性是否一定为非空 -->  
  24.          >  
  25.              <column name="ProvinceID" /><!-- 定义父对象(此处指City类对象)所对应的数据库表的外键 -->  
  26.         </many-to-one>  
  27.      </class>   
  28.     </hibernate-mapping>   

多对多的双向关联关系(中间表)    

在多对多的关联关系中,可拆分为两个一对多的关联关系,即在两个表中间增加一个关联表,记录这两个表之间的关联关系。若抛开关联表,则原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

[html] view plain copy
print?
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping>  
  7. <class  
  8.      name="model.ExamSortEnum"  
  9.      table="EXAM_SORT_ENUM"  
  10.      lazy="false"  
  11. >  
  12.      <id  
  13.          name="id"  
  14.          type="integer"  
  15.          column="ID"  
  16.          length="22"  
  17.      >  
  18.          <generator class="increment" />  
  19.      </id>  
  20.      
  21.      <property  
  22.          name="name"  
  23.          type="string"  
  24.          column="NAME"  
  25.          length="255"  
  26.      />  
  27.     <set name="subject" table="EXAM_SORT_ENUM_SUBJECT" lazy="true" cascade="save-update">  
  28.       <key column="exam_sort_enum_id"/>  
  29. <many-to-many column="subject_id" class="model.Subject"/>  
  30.     </set>  
  31. </class>  
  32. </hibernate-mapping>    
ExamSortEnum.java
[java] view plain copy
print?
  1. package model;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.HashSet;  
  5. import java.util.Set;  
  6.   
  7. public class ExamSortEnum   implements Serializable{  
  8.   
  9.   
  10. private static final long serialVersionUID = 1L;  
  11. private Integer id;  
  12. private String name;  
  13. private Set subject = new HashSet();  
  14.   
  15. public ExamSortEnum(){}  
  16. public ExamSortEnum(Integer id){  
  17.    setId(id);  
  18. }  
  19.   
  20. public void setSubject(Set subject){  
  21.    this.subject = subject;  
  22. }  
  23.   
  24. public Set getSubject(){  
  25.    return this.subject;  
  26. }  
  27.   
  28. public Integer getId() {  
  29.    return id;  
  30. }  
  31.   
  32. public void setId(Integer id) {  
  33.    this.id = id;  
  34. }  
  35.   
  36. public String getName() {  
  37.    return name;  
  38. }  
  39.   
  40. public void setName(String name) {  
  41.    this.name = name;  
  42. }  
  43. }  
关于映射文件:
映射文件要设置set,
name=subject 为ExamSortEnum.java文件中定义的Set对象,存储多个Subject类型的容器。
table="EXAM_SORT_ENUM_SUBJECT" 为对应的中间表的表名,由于两个业务表之间不能直接打交道,只能通过中间表来进行关联。
lazy="true" 延迟加载
cascade="save-update" 级联保存更新,若设置为all,delete,all-delete-orphans,则在删除一个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

[html] view plain copy
print?
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping>  
  7. <class  
  8.      name="model.Subject"  
  9.      table="SUBJECT"  
  10.      lazy="false"  
  11. >  
  12.      <id  
  13.          name="id"  
  14.          type="integer"  
  15.          column="ID"  
  16.          length="22"  
  17.      >  
  18.          <generator class="increment" />  
  19.      </id>  
  20.      
  21.      <property  
  22.          name="name"  
  23.          type="string"  
  24.          column="NAME"  
  25.          length="200"  
  26.      />  
  27.     
  28.     <set name="examSortEnum" table="EXAM_SORT_ENUM_SUBJECT" lazy="true" inverse="true" cascade="save-update">  
  29.       <key column="subject_id"/>  
  30. <many-to-many column="exam_sort_enum_id" class="model.ExamSortEnum"/>  
  31.     </set>  
  32. </class>  
  33. </hibernate-mapping>   
Subject.java
[java] view plain copy
print?
  1. package model;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.HashSet;  
  5. import java.util.Set;  
  6.   
  7. public class Subject implements Serializable{  
  8.   
  9. private static final long serialVersionUID = 1L;  
  10. private Integer id;  
  11. private String name;  
  12. private Set examSortEnum = new HashSet();  
  13.   
  14.   
  15. public Subject(){}  
  16. public Subject(Integer id){  
  17.    setId(id);  
  18. }  
  19.    
  20. public void setExamSortEnum(Set examSortEnum){  
  21.    this.examSortEnum = examSortEnum;  
  22. }  
  23. public Set getExamSortEnum(){  
  24.    return this.examSortEnum;  
  25. }  
  26.   
  27. public Integer getId() {  
  28.    return id;  
  29. }  
  30.   
  31. public void setId(Integer id) {  
  32.    this.id = id;  
  33. }  
  34.   
  35. public String getName() {  
  36.    return name;  
  37. }  
  38.   
  39. public void setName(String name) {  
  40.    this.name = name;  
  41. }  
  42. }   
关于映射文件:
内容与ExamSortEnum.hbm.xml差不多,只是多了一个inverse="true",告诉hibernate控制权不在此处,两个映射文件只能设置一个。

测试类:

[java] view plain copy
print?
  1. package model;  
  2.   
  3. import org.hibernate.Session;  
  4. import org.hibernate.SessionFactory;  
  5. import org.hibernate.Transaction;  
  6. import org.hibernate.cfg.Configuration;  
  7.   
  8. public class ExamSortEnumTest {  
  9. public static SessionFactory sf ;  
  10.   
  11. static{  
  12.    try{  
  13.     Configuration cfg = new Configuration().configure();  
  14.     sf = cfg.buildSessionFactory();  
  15.    }catch(Exception e){  
  16.     e.printStackTrace();  
  17.    }  
  18. }  
  19.   
  20. public void insert1(){  
  21.    Session sess = sf.openSession();  
  22.    Transaction tx = sess.beginTransaction();  
  23.    
  24.    Subject sa = new Subject();  
  25.    sa.setName("A1");  
  26.    
  27.    Subject sb = new Subject();  
  28.    sb.setName("B1");  
  29.   
  30.    Subject sc = new Subject();  
  31.    sc.setName("C1");  
  32.    
  33.    ExamSortEnum esea = new ExamSortEnum();  
  34.    esea.setName("A");  
  35.    esea.getSubject().add(sa);  
  36.    esea.getSubject().add(sc);  
  37.    
  38.    ExamSortEnum eseb = new ExamSortEnum();  
  39.    eseb.setName("B");  
  40.    eseb.getSubject().add(sb);  
  41.    eseb.getSubject().add(sc);  
  42.   
  43.    sess.save(esea);  
  44.    sess.save(eseb);  
  45.    
  46.    tx.commit();  
  47.    sess.close();  
  48.    
  49. }  
  50.   
  51. public static void main(String[] args){  
  52.    ExamSortEnumTest et = new ExamSortEnumTest();  
  53.    et.insert1();  
  54. }  
  55. }  
执行后的结果:
考试类别表: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

原创粉丝点击