Hibernate配置文件详解

来源:互联网 发布:美图秀秀为何没有mac版 编辑:程序博客网 时间:2024/06/17 06:11

本文创者:secyaher

本文来源:http://secyaher.blog.163.com/blog/static/38955772007102814446425/

 

Hibernate的基本配置文件有两种:hibernate.cfg.xml.hbm.xml文件。前者包含了Hibernate与数据库的基本连接信息,在Hibernate工作的初始阶段,这些信息被先后加载到ConfigurationSessionFactory实例;后者包含了Hibernate的基本映射信息,即系统中每一个类与其对应的数据库表之间的关联信息,在Hibernate工作的初始阶段,这些信息通过hibernate.cfg.xmlmapping节点被加载到ConfigurationSessionFactory实例。这两种文件信息包含了Hibernate的所有运行期参数。下面我们用详细的例子来说明这两种文件的基本结构和内容。
一、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设置。
考试类别表: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-3.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,则在删除一个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-3.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差不多,只是多了一个inverse="true",告诉hibernate控制权不在此处,两个映射文件只能设置一个。

测试类:
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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀疑老公有外遇最明智的怎么办 咽喉疼怎么办最简单的方法如下 生完孩子后腰疼的厉害怎么办 眼睛进东西了弄不出来怎么办 18k金不给换黄金怎么办 我22岁欠了10万怎么办 1岁宝宝又吐又拉怎么办 月经10天了还没干净怎么办 舌头有异味怎么办是有口臭吗 快8个月羊水破了怎么办 25岁欠了50万债怎么办 28岁血压高150低压110怎么办 苹果6的4g网络慢怎么办 一个月染了6次头怎么办 五0二干在衣服上怎么办 刚怀孕见红了肚子不痛怎么办 我有外遇了老婆不离婚怎么办 套了牙套的牙疼怎么办 我鼻子上有很多螨虫和黑头怎么办 鱼刺卡在喉咙怎么办最有效的办法 脚被蚊子咬了很痒怎么办 好压7z密码忘了怎么办 4g卡显示2g网络怎么办 过塑机把纸吞了怎么办 红米1s开不了机怎么办 跟老婆吵架闹的要离婚该怎么办 充了q币没有到账怎么办 9个月宝宝吃了盐怎么办 红米4x开不了机怎么办 鱼身上有红斑像出血了怎么办 草鱼身上有红斑像出血了怎么办 宝宝屁眼红的破皮了怎么办 孩子身上起红疙瘩很痒怎么办 久而不射,但软了怎么办 盆底综合肌力1级怎么办 头发掉的厉害怎么办吃什么好 给蜂蛰了肿了痒怎么办 小米手环2没电了怎么办 小米手环2不亮了怎么办 红米3s无限重启怎么办 乐视手机1s卡顿怎么办