`
luoxiaofei126
  • 浏览: 15856 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernat配置文件详解

阅读更多

 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"
级联保存更新,若设置为alldeleteall-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_idSubject表关联

class="model.Subject"
指定setname=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

分享到:
评论

相关推荐

    hibernate配置文件详解

    Hibernate 配置文件详解 Hibernate 是一个流行的 ORM(Object-Relational Mapping)框架,用于简化 Java 应用程序中的数据库交互。 Hibernate 的配置文件是其核心组件之一,用于定义 Hibernate 的运行期参数。下面...

    hibernate--5.Hibernate配置文件详解

    标题"hibernate--5.Hibernate配置文件详解"暗示我们将探讨的是Hibernate 5版本的配置细节。这个版本引入了一些新特性和改进,同时也保持了对前一版本的兼容性。配置文件是Hibernate的核心部分,它定义了与数据库的...

    hibernate--5.Hibernate配置文件详解-2

    标题"hibernate--5.Hibernate配置文件详解-2"暗示我们将继续上一节的内容,进一步深入理解Hibernate配置文件的各个方面。通常,Hibernate的配置文件以`hibernate.cfg.xml`的形式存在,它是项目初始化和连接数据库的...

    Hibernate配置文件hibernate.cfg.xml中配置信息详解

    Hibernate配置文件hibernate.cfg.xml中配置信息详解!

    struts2+spring+hibernate配置文件详解

    Hibernate配置文件主要包含数据库连接信息、JDBC驱动、实体类映射等。例如: ```xml &lt;hibernate-configuration&gt; &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect &lt;property name="...

    Hibernate 课件_配置文件详解

    ### Hibernate配置文件详解 #### Hibernate概述 Hibernate是一个开源的对象关系映射(ORM)框架,它为Java应用程序提供了简化的方式去处理数据库操作。通过使用Hibernate,开发者可以将Java对象映射到数据库表,并...

    Hibernate配置文件

    **Hibernate配置文件详解** Hibernate,一个强大的Java持久化框架,为开发者提供了对象关系映射(ORM)服务,简化了数据库操作。在Hibernate中,`hibernate.cfg.xml`是核心配置文件,它定义了数据库连接、实体管理...

    hibernate配置文件元素详解.txt

    ### Hibernate配置文件元素详解 #### 一、概述 在SSH(Spring+Struts+Hibernate)框架中,Hibernate作为持久层框架扮演着非常重要的角色。它能够实现对象关系映射(ORM),将Java对象映射到数据库表上。为了正确地...

    hibernate配置文件

    《Hibernate配置文件详解》 Hibernate,作为Java领域中广受欢迎的对象关系映射(ORM)框架,简化了数据库操作,使得开发者可以使用面向对象的方式处理数据。在Hibernate的应用中,配置文件起着至关重要的作用,它...

    hibernate的配置文件

    《Hibernate配置文件详解与必备库解析》 在Java开发领域,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,要充分利用Hibernate的功能,理解其配置文件和依赖库至关重要。本文将...

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...

    Hibernate_映射配置文件详解.ppt

    Hibernate_映射配置文件详解,很好用的学习文件

    spring配置文件详解

    Spring 配置文件详解 Spring 配置文件是 Spring 框架中最重要的配置文件之一,它负责定义和配置应用程序的Bean对象,以及它们之间的依赖关系。Spring 配置文件通常以XML文件的形式存在,文件名通常为...

    Hibernate自动生成配置文件

    ### Hibernate自动生成配置文件详解 #### 一、Hibernate与自动生成配置文件的重要性 在Java开发领域,Hibernate作为一款优秀的对象关系映射(Object-Relational Mapping,简称ORM)框架,极大地简化了Java应用与...

    hibernate 配置文件

    ### Hibernate配置文件详解 在Java开发环境中,Hibernate作为一款优秀的对象关系映射(Object-Relational Mapping,简称ORM)框架,极大地简化了数据库操作过程。本文将深入探讨Hibernate配置文件的相关知识点,...

Global site tag (gtag.js) - Google Analytics