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

一、hibernate.cfg.xml文件:                                                                                                                                                     


     
     
     
     
     
     
     
     root
     
     jdbc:mysql://localhost:3306/webases
     
     org.hibernate.dialect.MySQLDialect
     
     274507
     
     com.mysql.jdbc.Driver
     
     
     
      

二、.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文件进行修改,内容如下:

     
     
      
        
     
     
      
     
        
              
        
          
        
         
        
           lazy="true"
           inverse="true"
           cascade="delete"
          >
           
               
           
           
        
     
    
    

 将Hibernate自带工具Middlegen生成的City.hbm.xml文件进行修改,内容如下:
     
     
      
       
     
        
        
         
         
             
           
            
         
         
         
              class="com.xxx.hibernate.Province"
              cascade="none"
              outer-join="auto"
              not-null="true"
          >
              
         
       
      

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

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






     
         
     
   
     
    
      

    

  
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对象所引用。
指定中间表中参照为Exam_Sort_Enum表的外键为exam_sort_enum_id

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






     
         
     
   
     
  
    
      

    

 
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



你可能感兴趣的:(hibernate,Hibernate_hdkj)