`
youyu4
  • 浏览: 440576 次
社区版块
存档分类
最新评论

Hibernate--关系映射

 
阅读更多

声明:本贴只用于个人学习和总结,没有任何商业用途,如果侵权或问题,请尽早联系,本人马上删贴。 

 

Hibernate--关系映射

 

      在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系。而hibernate时间实体类和数据库中的表进行的映射,这些关系如何映射呢?这里简单总结一下:

 

 

一对多,多对一

 

这里拿学生和班级进行简单演示:

 

学生的类和对应的映射文件

 

private int sid ;  
private String sname ;  
  
private Classes classes ; //,引入班级对象,多对一

 

<class name="com.ljh.hibernate.pojo.Student" table="t_student" lazy="false">  
    <id name="sid" column="sid">  
        <generator class="native"/>  
    </id>  
    <property name="sname" column="sname" type="java.lang.String" length="20" not-null="true"/>         
      
    <!--   
        表示对象的关系:多对一  
        name 表示当前类的关系对象  
        column 表示数据库中外键字段(也是描述数据关系)  
        class 表示name属性值的类型  
        cascade 级联  
            主动方所做的操作(insert,update,delete),被动方也跟着做相同的操作。  
            取值:save-update、delete 、all  
            save-update : 保存或更新当前对象时,级联保存或更新关联对象  
            delete : 删除当前对象时,级联删除关联对象  
            all : 包含save,update,delete三种操作。  
            对于多对一的场合,级联不能使用delete和all,否则会违背数据关系完整性。  
        lazy : 延迟加载   
            延迟初始化对象信息,等使用对象时再查询数据库。   
            false : 禁用延迟加载  
            proxy : 使用延迟加载(默认值),采用cglib代理完成延迟加载的扩展功能。  
            no-proxy :  不使用代理,完成延迟加载 。可以使用第三方字节码增强工具。  
        fetch : 数据抓取策略  :根据主动方,查询被动方时所采用的查询方式。    
            fetch="select" 默认值,会采用多条语句的方式查找,往往会延迟加载数据  
            fetch="join"  默认会采用左连接查询数据,不会延迟加载数据。  
                not-null 如果取值为true,那么框架采用内连接查询数据。  
     -->  
    <many-to-one name="classes" column="cid" cascade="save-update" lazy="no-proxy" fetch="join" not-null="true" class="com.ljh.hibernate.pojo.Classes"></many-to-one>  
</class>  

 

 

班级的实体类和对应的映射文件

 

private int cid ;  
private String cname ;  
  
private Set<Student> studentSet = new HashSet<Student>(); //引入学生类的集合,一对多

 

<class name="com.ljh.hibernate.pojo.Classes" table="t_classes" >  
    <id name="cid" column="cid">  
        <generator class="native"/>  
    </id>  
    <property name="cname" column="cname" type="java.lang.String" length="20" not-null="true"/>     
      
    <!-- 声明   一对多映射  
        lazy : 延迟加载  
            false : 禁用延迟加载  
            true : 延迟加载(默认值)  
            extra : 支持延迟加载的。(推荐)  
                当获取集合自身信息时,可以发送高效的查询语句。  
                例如:只希望获取集合的长度,而不需要获取集合中数据的信息,框架会通过函数执行查询进行计算集合长度。。  
      
        fetch : 数据抓取策略  
                查询关联对象的数据时,所采用的查询方式。  
            join : 通过一条连接语句进行立即查询。(延迟加载不起作用)  
            select : 通过多条查询语句进行查询。  
            subselect : 通过子查询语句进行立即查询。  (不推荐使用)(默认情况下和select取值结果相同)  
          
        not-null="true" 对于一对多的查询,即使设置了not-null语句,依然采用左连接查询。  
          
        Inverse="true",表示控制反转,由对方也就是学生方来进行管理外键。因为外键在学生    
     -->  
    <set name="studentSet" cascade="all" inverse="true" fetch="subselect">  
        <key column="cid" not-null="true"></key>  
        <one-to-many class="com.bjpowernode.hibernate.pojo.Student"/>  
    </set>  
</class>  

 

 

自关联:就是在自己的类进行关联自己,例如父菜单与子菜单的关系,对应的实体类,和映射文件

 

private int mid ;           
private String name ;  
private Set<Menu> menuSet = new HashSet<Menu>(); //父菜单与子菜单的关系为:一对多  
private Menu pmenu ; //子菜单和父菜单的关系为:多对一  

 

<class name="com.ljh.hibernate.pojo.Menu" table="t_menu" >  
    <id name="mid" column="mid">  
        <generator class="native"/>  
    </id>  
    <property name="name" column="name" type="java.lang.String" length="20" not-null="true"/>   
      
    <many-to-one name="pmenu" column="m_id" cascade="save-update"></many-to-one>  
      
    <!--  
        自关联表的设计:外键字段不能为非空。 
     -->  
    <set name="menuSet" cascade="all" inverse="true">  
        <key column="m_id"></key>  
        <one-to-many class="com.ljh.hibernate.pojo.Menu"/>  
    </set>  
</class>  

 

 

 

一对一

 

假如是主键一对一用来映射:也就是说被动方的主键是来自于主动方的主键,也可以将之称之为外键:

 

类之间相互添加彼此的应用。

映射文件中主动方,增加一对一标签:

 

<one-to-one name="userinfo" cascade="all" class="com.ljh.hibernate.pojo.UserInfo"></one-to-one>  
  
              被动方,主键又是外键,也添加一对一的映射标签:  
    <id name="uid" column="uid">  
        <generator class="foreign">  
            <param name="property">user</param>  
        </generator>  
    </id>  
      
    <!--   
        描述一对一关系关系映射  
        constrained="true" : 表示强制要求一对一使用外键关联。增加外键约束。  
     -->  
    <one-to-one name="user" constrained="true"  class="com.ljh.hibernate.pojo.User"></one-to-one>  
 

 

 

使用外键约束,其实是多对一的特殊情况,例如学生对班级

 

类添加彼此的应用。

 

映射文件中学生端主动端,添加外键进行约束,添加多对一标签

 

<!--   
    unique : 唯一约束  
      
        如果外键含有unique约束,那么表示主动方和被动方的关系为一对一。  
          
        对于一对一映射来讲,可以设置级联关系为delete 和 all  
          
        根据主动方查询被动方关联数据,是支持延迟加载的。  
 -->  
<many-to-one name="classes" column="cid" unique="true" cascade="all" class="com.ljh.hibernate.pojo.Classes"></many-to-one>  
  
               班级端的映射文件:添加一对一的标签:  
<one-to-one name="student" cascade="all" property-ref="classes" class="com.ljh.hibernate.pojo.Student"></one-to-one>  

 

 

 

 

多对多

                  

 

例如学生对课程的对应,在数据库中会生成第三张表进行维护,在各自的类中引入对方的set集合,表示多对多。

 

学生端:

<set name="courseSet" table="t_student_course" cascade="save-update">  
    <key column="sid"></key>  
    <many-to-many class="com.ljh.hibernate.pojo.Course" column="cid"></many-to-many>  
  
</set>  

 

课程端:

<!--   
    对于多对多来讲,级联只能设置cascade="save-update"是合理的  
    inverse="true" 让集合一端去维护中间表数据。任意一端都可以。  
 -->  
  
<set name="studentSet" table="t_student_course"  cascade="save-update"  inverse="true">  
    <key column="cid"></key>  
    <many-to-many class="com.ljh.hibernate.pojo.Student" column="sid"></many-to-many>  
</set>  

 

 

 

联合主键的映射,这种情况很少见

 

出现了这种联合键时,需要我们为其定义一个联合主键的类(实现Serializable接口),类中声明多个字段的属性,表示联合主键字段。

 

在配置映射文件时,主键的配置利用联合主键的标签即可:

<composite-id name="id">              
   <key-property name="title"></key-property>  
   <key-property name="author"></key-property>  
</composite-id>

  

分享到:
评论

相关推荐

    hibernate-configuration-3.0.dtd、hibernate-mapping-3.0.dtd

    在Java世界里,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而`hibernate-configuration-3.0.dtd`和`hibernate-mapping-3.0.dtd`是Hibernate 3.0版本中的两个核心文件,它们定义了...

    hibernate-release-4.1.4

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发人员在处理数据库时使用面向对象的概念,极大地简化了数据库操作。此版本包含了Hibernate的核心库和其他相关组件,使得开发者能够将Java类与数据库表...

    hibernate-release-5.2.10

    Hibernate是Java平台上的一款开源对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作。在SSH(Spring、Struts、Hibernate)框架中,Hibernate作为持久层的解决方案,极大地简化了数据库操作的...

    hibernate-release-5.0.7.Final的所有jar包

    Hibernate是Java领域中一款著名的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据库编程。在这个`hibernate-release-5.0.7.Final`版本中,包含了所有相关的jar包,为开发者...

    hibernate-extensions和Middlegen-Hibernate

    在Java的持久化层开发中,Hibernate作为一款强大的ORM(对象关系映射)框架,极大地简化了数据库操作。然而,手动编写实体类和映射文件(hbm.xml)的过程仍需消耗大量时间。为了解决这一问题,两个工具——hibernate...

    hibernate-commons-annotations-5.0.1.Final.jar

    4. `org.hibernate.boot.model`和`org.hibernate.boot.model.source`:这两个包包含了模型构建和源代码解析的相关类,用于构建实体类的元模型,是Hibernate映射的基础。 5. `org.hibernate.boot.registry`:这部分...

    hibernate-core 核心jar包

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作与业务对象进行解耦,简化了数据库编程。`hibernate-core`是Hibernate的核心库,包含了执行ORM功能所需的主要组件。 在Hibernate-...

    HIBERNATE - 符合Java习惯的关系数据库持久化

    Hibernate是Java领域内最受欢迎的对象关系映射(ORM)框架之一,它简化了Java应用程序与关系型数据库之间的交互,使得开发人员能够用面向对象的方式处理数据库操作,而无需深入了解SQL语法或数据库API。通过将Java...

    Hibernate稳定版(hibernate-release-5.3.23.Final.zip)

    Hibernate稳定版(hibernate-release-5.3.23.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。

    hibernate-5.2.15. 最新jar包

    Hibernate是Java领域中一款著名的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据库编程。在这个“hibernate-5.2.15. 最新jar包”中,包含的是Hibernate 5.2.15.Final版本...

    HIbernate-tools修改记录

    2. 映射文件生成:原有的映射文件生成功能也进行了改进,现在支持XML和注解两种方式,且能够自动处理复杂的数据类型和关系映射,减少了手动编写的工作量。 3. 数据库反向工程:在新版本中,Hibernate-tools的数据库...

    Hibernate稳定版(hibernate-release-5.6.2.Final.zip)

    Hibernate稳定版(hibernate-release-5.6.2.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。

    hibernate-cglib-repack-2.1_3.jar.zip

    在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而CGLIB则是一个代码生成库,它允许开发者在运行时动态创建子类,对Java类进行扩展。本文将详细探讨Hibernate-CGLIB的...

    Hibernate-Extension Middlegen-Hibernate

    Hibernate的核心功能包括:持久化类、对象-关系映射、查询语言HQL等。 Middlegen,全称为Middle Generation,是针对Hibernate的一个扩展工具,它的主要作用是自动生成基于Hibernate的持久化类、映射文件和相关的DAO...

    Middlegen-Hibernate-r5

    在Java世界中,ORM(对象关系映射)框架的使用极大地简化了数据库操作。其中,Hibernate作为一款强大的ORM框架,深受开发者喜爱。而Middlegen则是与Hibernate配套使用的工具,它能自动生成Hibernate的持久层代码,...

    hibernate-release-4.3.1.Final.zip

    Hibernate是Java开发中广泛使用的对象关系映射(ORM)工具,它允许开发者用面向对象的方式来操作数据库,从而简化了数据持久化的复杂性。这个版本可能是Hibernate的稳定版本,标记为"Final"意味着它经过充分测试,...

    Hibernate-annotations-3.4最新版本

    为了有效地管理数据对象与数据库之间的映射关系,Hibernate作为一款强大的Java对象关系映射(ORM)框架,极大地简化了这一过程。特别是其注解版本Hibernate-annotations,自3.4.0版本起,更是为开发者提供了更加便捷...

    最新 hibernate-release-4.2.13.Final.tgz

    Hibernate,作为Java领域最著名的对象关系映射(ORM)框架之一,极大地简化了数据库操作,使得开发者能够用面向对象的方式来处理数据。本资源包“hibernate-release-4.2.13.Final.tgz”提供了一个完整的Hibernate ...

    hibernate-release-5.0.0.Final(1).zip

    Hibernate,作为一个开源的对象关系映射(ORM)框架,自发布以来就深受Java开发者喜爱。本次我们将深入探讨的版本是`hibernate-release-5.0.0.Final(1)`,这个版本在Hibernate的生命周期中具有重要的地位,它引入了...

    hibernate-annotations-3.4.0.GA

    Hibernate是Java领域中广泛应用的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。而Hibernate Annotations是Hibernate框架的一个重要组成部分,它引入了基于注解...

Global site tag (gtag.js) - Google Analytics