`

Hibernate映射总结

阅读更多

1.多对一映射

对象模型:

 

User Group

id:int

name:String

group:Group

id:int

  name:String 

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="User" table="t_user"> 
   <id name="id" column="id"> 
    <generator class="identity"/> 
   </id> 
   <property name="name" column="User_name" unique="true"/> 
   <many-to-one name="group" column="groupid"/> 
  </class> 
</hibernate-mapping>

 

2.1、一对一主键关联映射(单向Person-->IdCard

对象模型:

 

Person IdCard

id:int

name:String

idCard:IdCard

id:int

  cardNo:int

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="Person" table="t_person"> 
   <id name="id"> 
    <generator class="foreign"> 
    <param name="property">idCard</param> 
    </generator> 
   </id> 
   <property name="name" column="Person_name" /> 
   <one-to-one name="idCard" constrained="true"/> 
  </class> 
</hibernate-mapping>

  注意

 

 

  <!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
  constrained="true", 表明当前主键上存在一个约束,person的主键作为外键参照了idCard 
  -->

一对一主键关联映射中,默认了Cascade属性。只有在<one-to-one>标签中才会默认。

  一对一是从Person这个角度看的,看到这个人知道它的身份证号。主键关联,Person中的主键是个外键,参照IdCard的主键生成,怎样让生成的主键一样。

  一对一主键关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建。

 

2.2一对一主键关联映射:(双向关联Person<---->IdCard

 

对象模型:

 

 

Person IdCard

id:int

name:String

idCard:IdCard

id:int

  cardNo:int

person:Person

 

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="Person" table="t_person"> 
   <id name="id"> 
    <generator class="foreign"> 
    <param name="property">idCard</param> 
    </generator> 
   </id> 
   <property name="name" column="Person_name" /> 
   <one-to-one name="idCard" constrained="true"/> 
  </class> 

  <class name="IdCard" table="t_card"> 
   <id name="id"> 
    <generator class="foreign"> 
    <param name="property">person</param> 
    </generator> 
   </id> 
   <property name="cardNo" column="CardNo" /> 
   <one-to-one name="person" constrained="true"/> 
  </class> 
</hibernate-mapping>

 

2.3 一对一外键关联映射(单向)

对象模型:

Person IdCard

id:int

name:String

idCard:IdCard

id:int

  cardNo:int

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="Person" table="t_person"> 
   <id name="id"> 
    <generator class="identity"> 
    </generator> 
   </id> 
   <property name="name" column="Person_name" /> 
   <many-to-one name="idCard" unique="true"></many-to-one> 
  </class> 
</hibernate-mapping>

注意:此处比普通的多对一关系多了一个unique="true"表示唯一外键关联,也可实现一对一的映射关系。

2.4 一对一外键关联映射(双向)

对象模型:

 

Person IdCard

id:int

name:String

idCard:IdCard

id:int

  cardNo:int

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 

  <class name="Person" table="t_person"> 
   <id name="id"> 
    <generator class="identity"> 
    </generator> 
   </id> 
   <property name="name" column="Person_name" /> 
   <many-to-one name="idCard" unique="true"></many-to-one> 
  </class> 


  <class name="IdCard" table="t_idcard"> 
   <id name="id" column="id"> 
    <generator class="identity"/> 
   </id> 
   <property name="cardNo" column="cardno" /> 
   <one-to-one name="person" property-ref="idCard"></one-to-one> 
  </class> 

</hibernate-mapping>

 

注意:

<one-to-one>默认是与主键比较,Property-ref=”idCard”会指定与哪一个字段比较.

加入<one-to-one>标签和数据库没有关系,是告诉Hibernate怎么来做这件事,所以数据库不用重新导出,不像<many-to-one>因为. <many-to-one>要在表里加字段

注: 

 

<one-to-one>标签 含义:指示如何加载关联对象,或者引用对象,默认根据主键加载,

<many-to-one>标签含义:加入外键在多的一端,指向一的一端

 

3.1.一对多关联(单向)

模型文件:

Classes Student

id:int

name:String

student:Set

id:int

  name:String

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="Class" table="t_class"> 
   <id name="id"> 
    <generator class="native"/> 
   </id> 
   <property name="name" /> 
   <set name="student" inverse="false" cascade="all">          <key column="classid" /> 
   <one-to-many class="Student"/> 
   </set> 
  </class> 
</hibernate-mapping>

 在该配置文件中,inverse可以使用默认false,或者显示指定false,如以上代码。这样就指定一对多之间的关系由Class这个POJO来维护。在单项一对多关联中,这一点很重要,下面我们通过测试来说明。cascade="all"指定级联的之间的等级,它具有如下几种值:

all : 所有情况下均进行关联操作。 
none:所有情况下均不进行关联操作。这是默认值。 
save-update:在执行save/update/saveOrUpdate时进行关联操作。 
delete:在执行delete时进行关联操作。

缺点:若将Student的classid设置为非空,将无法保存。因为不是student这一端维护关系,所以student不知道是哪个班级.

改进 采用 一对多双向关联

<set name="student" inverse="true">

这样的好处是 存入数据让多的一端进行维护,不需要发出多余的update.<!-- 分页 -->

 

3.2.一对多关联(双向)

模型文件:

Classes Student

id:int

name:String

student:Set

id:int

  name:String

映射关系:

<hibernate-mapping >
  <class name="Class" table="t_class"> 
   <id name="id"> 
    <generator class="native"/> 
   </id> 
   <property name="name" /> 
   <set name="student" inverse="false" cascade="all">          <key column="classid" /> 
   <one-to-many class="Student"/> 
   </set> 
  </class>

 

  <class name="com.jonsion.hibernate.Student" table="t_student">
    <id name="id">
      <generator class="native"/>
    </id>
    <property name="name"/>
    <many-to-one name="classes" column="classid"/>
    </class>
</hibernate-mapping>

 

 

4.1多对多映射(单向)

对象模型:

Role User

id:int

name:String

 

id:int

  name:String

role:Set

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="User" table="t_user"> 
   <id name="id"> 
    <generator class="native"/> 
   </id> 
   <property name="name" /> 
   <set name="role" table="t_user_role"> 
   <key column="userid"></key> 
   <many-to-many class="Role" column="roleid" /> 
   </set> 
  </class> 
</hibernate-mapping>

这样,hibernate会自动产生中间表t_user_role(userid,roleid) 并且是复合主键,userid为t_user的外键,roleid为t_role的外键

 

4.2多对多映射(双向)

对象模型:

Role User

id:int

name:String

 user:Set

id:int

  name:String

role:Set

 

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 

    <class name="User" table="t_user"> 
   <id name="id"> 
    <generator class="native"/> 
   </id> 
   <property name="name" /> 
   <set name="role" table="t_user_role"> 
   <key column="userid"></key> 
   <many-to-many class="Role" column="roleid" /> 
   </set> 
  </class>
  <class name="Role" table="t_role"> 
   <id name="id"> 
    <generator class="native"/> 
   </id> 
   <property name="name" /> 
   <set name="user" table="t_user_role"> 
   <key column="userid"></key> 
   <many-to-many class="User" column="userid" /> 
   </set> 

  </class> 
</hibernate-mapping> 

 

注意:

上面中间表名字是一样的

这样,hibernate也会自动产生中间表t_user_role(userid,roleid) 并且是复合主键,userid为t_user的外键,roleid为t_role的外键

 

 

5.1第一继承映射

Animal 
private int id
private String name
private Boolean sex
--------------------------------------------------
public class Bird extends Animal 
private int height
--------------------------------------------------
public class Pig extends Animal
private int weight

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="Animal" table="t_animal" > 
   <id name="id" > 
    <generator class="native"/> 
   </id> 
   <discriminator column="type" type="string"></discriminator> 
   <property name="name"/> 
   <property name="sex"/> 
   <subclass name="Pig" discriminator-value="P"> 
    <property name="weight"/> 
   </subclass> 
   <subclass name="Bird" discriminator-value="B"> 
    <property name="height"/> 
   </subclass> 
  </class> 
</hibernate-mapping>

5.2第二继承映射

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="Animal" table="t_animal" > 
   <id name="id" > 
    <generator class="native"/> 
   </id> 
   <property name="name"/> 
   <property name="sex"/> 
    <joined-subclass name="Pig" table="t_pig"> 
     <key column="pid"/> 
     <property name="weight"/> 
    </joined-subclass> 
    <joined-subclass name="Bird" table="t_bird"> 
     <key column="bid"/> 
     <property name="height"/> 
    </joined-subclass> 

</class> 
</hibernate-mapping>

5.2第三继承映射

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="Animal" table="t_animal" > 
   <id name="id" > 
    <generator class="native"/> 
   </id> 
   <property name="name"/> 
   <property name="sex"/> 
   <union-subclass name="Pig" table="t_pig"> 
   <property name="weight"/> 
   </union-subclass> 
   <union-subclass name="Bird" table="t_bird"> 
   <property name="height"/> 
   </union-subclass> 
</class> 
</hibernate-mapping>

6.Component 映射

component不是实体,没有OID

对象模型

public class Employee 
private int id
private String name
private Contact contact
-------------------------------------
public class Contact  
private String email
private String address
private String zipcode
private String contactTel
-------------------------------------
public class User  
private int id
private String name
private Contact contact

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="User" table="t_user" > 
   <id name="id" > 
    <generator class="native"/> 
   </id> 
   <property name="name"/> 
   <component name="contact"> 
   <property name="email"></property> 
   <property name="address"></property> 
   <property name="zipcode"></property> 
   <property name="contactTel"></property>
 

   </component> 

  </class> 
 </hibernate-mapping>

 

7 复合主键mapping

通常将复合主键相关属性,单独放到一个类中

这个类必须实现 Serializable接口

这个类必须重写hashCode()和equals()方法

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="SC" table="t_sc" > 
   <composite-id name="scpk"> 
   <key-property name="sno"/> 
   <key-property name="cno"/> 
   </composite-id>
  
   <property name="sname"></property> 
   <property name="cname"></property> 
  </class> 
</hibernate-mapping>

 

 

分享到:
评论

相关推荐

    Hibernate关联映射总结

    ### Hibernate关联映射总结 #### 一、基础知识 在探讨Hibernate中的关联映射之前,我们需要先理解几个基本概念,这将有助于我们更好地理解和应用这些关联映射。 - **主键**(Primary Key):主键是用来唯一标识一...

    hibernate映射关系总结

    hibernate开发的关系: one-to-one,many-to-one,many-to-many学习经验总结

    Hibernate 映射文件自动生成

    【压缩包子文件的文件名称列表】:“hibernate映射文件自动生成.doc”很可能是这篇博文的文档形式,其中详细介绍了具体的操作步骤、使用工具或者自定义脚本,以帮助开发者理解并应用自动化的映射文件生成过程。...

    hibernate表的映射关系总结

    hibernate表映射一直记不住,这次总结一下,放便下次使用。。。

    Hibernate映射配置实例大全(详细总结)

    "Hibernate映射配置实例大全"是一个全面深入的资源,旨在帮助开发者理解和掌握如何有效地配置Hibernate以实现对象关系映射(ORM)。在这个文档中,我们将探讨各种关键的映射配置方法,以及相关的实例。 首先,我们...

    Hibernate映射关联关系总结

    对Hibernate映射关系详细总结,可以帮助你学习Hibernate知识

    hibernate映射枚举类型

    Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了一种优雅的方式来映射枚举类型到数据库。本文将深入探讨Hibernate如何映射枚举类型,并给出实际应用示例。 ### Hibernate枚举映射方式 #### 1. `@...

    Hibernate映射树形结构

    标题“Hibernate映射树形结构”指的是如何用Hibernate来存储和操作具有层级关系的数据。 1. **单表映射策略**: Hibernate可以使用单个表来存储树形结构,通过一个自增的`id`字段以及一个表示父节点的`parent_id`...

    hibernate 对象关系映射总结hibernate 对象关系映射总结

    ### Hibernate对象关系映射详解 #### 一、概述 Hibernate是一种用于Java环境下的持久层框架,它主要解决了对象关系映射的问题。通过将Java对象与数据库表进行映射,可以实现对象与关系型数据库之间的无缝转换。这...

    hibernate映射文件配置分析及要点

    hibernate 映射文件 配置分析及要点,你还在为配置hibernate 映射文件而发愁吗?这里总结了它的常用元素及属性。session,SessionFactory的应用

    hibernate 映射关系学习入门 多对多实体映射

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    hibernate 映射关系学习入门 一对一映射

    总结,一对一映射是Hibernate中的一个重要特性,它使得Java对象与数据库记录之间的对应关系更为灵活。理解并熟练运用一对一映射,能够帮助开发者更好地设计和实现复杂的业务逻辑,提高代码的可读性和维护性。通过...

    Hibernate映射配置详解

    总结,理解并熟练掌握Hibernate的映射配置是使用Hibernate的关键。通过正确配置,我们可以将复杂的数据库操作转化为简单的Java代码,提高开发效率,并减少错误。在SSH框架下,Hibernate更是成为了企业级应用的首选...

    XDoclet 与Hibernate 映射

    总结来说,XDoclet和Ant在Java开发中扮演着重要角色,前者简化了Hibernate映射文件的管理,后者则为项目构建和自动化提供了强大支持。通过合理的利用这两者,开发者可以提高工作效率,降低出错概率,使项目管理更加...

    hibernate集合的映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象的集合属性上,以便实现对象关系映射(ORM)。本文将深入探讨Hibernate中的四种主要集合映射类型:Set、List、Array和Map,以及它们在实际...

    hibernate 映射模板

    总结来说,Hibernate映射模板是实现ORM的关键,它定义了Java对象和数据库表之间的对应关系,包括字段映射、关系映射等。通过熟练掌握和应用这些模板,开发者可以更高效地进行数据库操作,提高开发效率。在实际开发中...

    hibernate学习总结文档

    Hibernate 是一个开源的对象关系映射(ORM)框架,它为 Java 开发者提供了一种在 Java 应用程序中管理关系数据库的方式。通过 ORM,Hibernate 可以将 Java 类与数据库表之间的映射关系自动化,从而简化数据访问层的...

    JAVA数据类型与Hibernate的类型映射

    此外,自定义对象的映射是Hibernate映射中的一个重要部分。通过在实体类上使用@Entity注解,并使用@Id注解指定主键字段,可以将一个Java类映射到数据库的一张表。字段则通过@Column注解来指定列名和属性,如长度、...

    hibernate映射

    总结来说,Hibernate映射是连接Java对象与数据库之间的重要纽带,通过一系列工具和技术,简化了数据持久化的复杂度,提高了开发效率和代码可维护性。掌握Hibernate映射机制对于任何Java开发者而言都是必不可少的技能...

    Hibernate 各种映射的配置文件总结

    ### Hibernate映射配置详解 #### 引言 Hibernate作为Java领域中最流行的ORM(对象关系映射)框架之一,为开发者提供了强大的数据持久化能力。它能够将Java对象映射到数据库表,反之亦然,从而简化了数据访问层的...

Global site tag (gtag.js) - Google Analytics