Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 362|回复: 0

[Java框架学习]Hibernate映射的基本操作

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-7 00:01:37 | 显示全部楼层 |阅读模式
    Hibernate映射主要是通过对象关系映射文件实现,对象关系映射文件把数据库中的实体(一般为二维表)映射到面向对象中的实体对象,把数据库中多个表之间的相互关系也反映到映射好的类中。以后,在Hibernate中对数据库的操作就直接转换为对这些实体对象的操作了。
       
        1.    映射文件说明:
       
       
        正确理解各个配置选项的含义是掌握映射文件的关键。映射文件可以对面向对象中的关联关系、继承关系和组合关系等各种关系进行配置。如:
       

       
      
       
       
         
       

         
       
      


      
       
       
       
         <!-- XML
         文件的声明
          -->
         
       
         <?
         xml
         version
         =
         "1.0"
         encoding
         =
         "utf-8"
         ?>
         
       
         <!-- hibernate DTD
         文件的声明
          -->
         
       
         <!
         DOCTYPE
         hibernate-mapping
         PUBLIC
         
       
                
         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
         
       
                
         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
         >
         
       
         <!--
         映射文件的根节点
          -->
         
       
         <
         hibernate-mapping
         >
         
       
         <!--
         
       
         对象关系映射的开始:
         class
         元素表示类和数据库中的表的映射关系。
         
       
         name
         属性指定持久化类(或者接口)的
         java
         全限定名;
         
       
         table
         属性指定要映射的对应的数据库表名
         
       
          -->
         
       
             
         <
         class
         name
         =
         "org.qiujy.bean.User"
         table
         =
         "user"
         >
         
       
              <!--
         
       
         持久化类对象的对象标识符
         (OID)
         和表的主键的映射关联:
         
       
         name
         属性指定类中作为
         OID
         的属性名;
         
       
         column
         属性表中主键字段的名字;
         
       
         type
         属性指定
         Hibernate
         的映射类型
         
       
               -->
         
       
                
         <
         id
         name
         =
         "id"
         column
         =
         "id"
         type
         =
         "int"
         >
         
       
                       <!--
         指定对象标识符生成器:
         class
         属性指定生成器的类别名
          -->
         
       
                     
         <
         generator
         class
         =
         "native"
         />
         
       
                
         </
         id
         >
         
       
                  <!--
         
       
         普通属性的映射:
         
       
         name
         属性:属性的名字
         ,
         以小写字母开头;
         
       
         column
         属性:对应的数据库字段名
         
       
         type
         属性:
         指定
         Hibernate
         的映射类型
         
       
         -->
         
       
                
         <
         property
         name
         =
         "name"
         column
         =
         "name"
         type
         =
         "string"
         />
         
       
                
         <
         property
         name
         =
         "age"
         column
         =
         "age"
         type
         =
         "int"
         />
         
       
             
         </
         class
         >
         
       
         </
         hibernate-mapping
         >
         
       
      


      


    2.    Hibernate映射类型:


    在对象-关系映射文件中,Hibernate映射类型作为Java类型和SQL类型的桥梁。在映射文件中建议使用Hibernate映射类型。


    2.1.        java基本映射类型的Hibernate映射类型:


    Java类型、Hibernate映射类型以及SQL类型之间的对应关系:


      
       
       
       
         Java
         类型
         
       
       
         Hibernate
         映射类型
         
       
       
         标准
         SQL
         类型
         
       
       
       
       
         int或java.lang.Integer
         
       
       
         integer或int
         
       
       
         INTEGER
         
       
       
       
       
         long或java.lang.Long
         
       
       
         long
         
       
       
         BIGINT
         
       
       
       
       
         short或java.lang.Short
         
       
       
         short
         
       
       
         SMALLINT
         
       
       
       
       
         byte或java.lang.Byte
         
       
       
         byte
         
       
       
         TINYINT
         
       
       
       
       
         float或java.lang.Float
         
       
       
         float
         
       
       
         FLOAT
         
       
       
       
       
         double或java.lang.Double
         
       
       
         double
         
       
       
         DOUBLE
         
       
       
       
       
         java.math.BigDecimal
         
       
       
         big_decimal
         
       
       
         NUMERIC
         
       
       
       
       
         char或java.lang.Character
         
       
       
         character
         
       
       
         CHAR(1)
         
       
       
       
       
         java.lang.String
         
       
       
         string
         
       
       
         VARCHAR
         
       
       
       
       
         boolean或java.lang.Boolean
         
       
       
         boolean
         
       
       
         BIT
         
       
       
       
       
         boolean或java.lang.Boolean
         
       
       
         yes_no
         
       
       
         CHAR(1)("Y"或" N")
         
       
       
       
       
         boolean或java.lang.Boolean
         
       
       
         true_false
         
       
       
         CHAR(1)("T"或" F")
         
       
      


      


    2.2.        java时间和日期类型的Hibernate映射类型:


      
       
       
       
         Java
         类型
         
       
       
         Hibernate
         映射类型
         
       
       
         标准
         SQL
         类型
         
       
       
         说明
         
       
       
       
       
         java.util.Date或java.sql.Date
         
       
       
         date
         
       
       
         DATE
         
       
       
         日期
         
       
       
       
       
         java.util.Date或java.sql.Time
         
       
       
         time
         
       
       
         TIME
         
       
       
         时间
         
       
       
       
       
         java.util.Date或java.sql.Timestamp
         
       
       
         timestamp
         
       
       
         TIMESTAMP
         
       
       
         时间戳
         
       
       
       
       
         java.util.Calendar
         
       
       
         calendar
         
       
       
         TIMESTAMP
         
       
       
          
         
       
       
       
       
         java.util.Calendar
         
       
       
         calendar_date
         
       
       
         DATE
         
       
       
          
         
       
      


      


    2.3.        java大对象类型的Hibernate映射类型:


      
       
       
       
         Java
         类型
         
       
       
         Hibernate
         映射类型
         
       
       
         标准
         SQL
         类型
         
       
       
         MySQL
         类型
         
       
       
         Oracle
         类型
         
       
       
       
       
         byte[]
         
       
       
         binary
         
       
       
         VARBINARY(
         或者
         BLOB)
         
       
       
         BLOB
         
       
       
         BLOB
         
       
       
       
       
         java.lang.String
         
       
       
         text
         
       
       
         CLOB
         
       
       
         TEXT
         
       
       
         CLOB
         
       
       
       
       
         实现
         java.io.Serializable
         接口的任意一个
         java
         类
         
       
       
         serializable
         
       
       
         VARBINARY(
         或者
         BLOB)
         
       
       
         BLOB
         
       
       
         BLOB
         
       
       
       
       
         java.sql.Clob
         
       
       
         clob
         
       
       
         CLOB
         
       
       
         TEXT
         
       
       
         CLOB
         
       
       
       
       
         java.sql.Blob
         
       
       
         blob
         
       
       
         BLOB
         
       
       
         BLOB
         
       
       
         BLOB
         
       
      


      


    3.    映射对象标识符(OID):


    Hibernate中使用对象标识符(OID)来惟一标识一个对象。为了应付多变的业务要求,Hibernate制定了多种主键生成器。在hibernate的映射文件中,可以指定主键的生成器,如:


      
       
       
       
         <
         id
         name
         =
         "id"
         column
         =
         "id"
         type
         =
         "int"
         >
         
       
             
         <
         generator
         class
         =
         "native"
         />
         
       
         </
         id
         >
         
       
      


    Hibernate提供的几种内置标识符生成器:


      
       
       
       
         标识符生成器
         
       
       
         描述
         
       
       
       
       
         increment
         
         
       
       
         由
         hibernate自动以递增的方式生成标识符,每次增量为1.适用于代理
         主键
         
       
       
       
       
         identity
         
         
       
       
         由底层数据库生成标识符.数据库必须支持自动增长字段类型,不便于不同数据库之间的移植.适用于代理
         主键
         
       
       
       
       
         sequence
         
         
       
       
         Hibernate根据底层数据库序列来生成标识符.前提是条件是底层数据库支持序列(如Oracle).适用于代理
         主键
         
       
       
       
       
         hilo
         
         
       
       
         Hibernate根据high/how算法来生成标识符.适用于代理
         主键
         
       
       
       
       
         seqhilo
         
         
       
       
         使用一个高/低位算法来高效的生成
       
    1. long
    复制代码
    ,
       
    1. short
    复制代码
    或者
       
    1. int
    复制代码
    类型的标识符,给定一个数据库序列(sequence)的名字.适用于代理
         主键
         
         
       
       
       
       
         native
         
         
       
       
         根据底层数据库对自动生成标识符的支持能力,来选择identity
         ,sequence
         或hilo
         .适用于代理主键
         
       
       
       
       
         uuid.hex
         
         
       
       
         Hibernate采用128位的UUID(Universal Unique Identification)算法来生成标识符.UUID算法能够在网络环境中生成唯一的字符串标识符.但字符串型的
         主键比整型的
         主键占用更多的数据库空间.适用于代理
         主键
         
       
       
       
       
         uuid.string
         
         
       
       
         使用UUID算法来生成标识符.UUID被编码为一个16个字符长的任意ASCII组成的字符串。适用于代理
         主键
         
       
       
       
       
         assigned
         
         
       
       
         由Java应用程序负责生成标识符,需在保存数据前完成.适用于自然
         主键
         
       
      


    4.    映射自然主键:


    代理主键是指与业务逻辑没有联系的主键,而自然主键指与业务逻辑相关的主键。
    Hibernate
    中推荐使用代理主键,而应该尽量不使用自然主键,因为自然主键与业务逻辑联系紧密,一旦自然主键的需求发生变化,与之相关的程序就要变化。自然主键在遗留的旧系统中仍然大量的存在。


    如:某人设计的学生表中没有定义代理主键ID,而是以学号(no)字段作为主键,那么相应的学生类中不必定义属性ID,而是以no属性作为OID。映射文件为:


      
       
       
       
         ……
         
       
         <
         id
         name
         =
         "no"
         column
         =
         "no"
         type
         =
         "int"
         >
         
       
              <!--
         指定主键生成方式为
         Assigned -->
         
       
             
         <
         generator
         class
         =
         "assigned"
         />
         
       
         </
         id
         >
         
       
         ……
         
       
      


    也就是说由程序负责给主键赋值。


    5.    映射复合自然主键:


    如某人设计的学生表中没有定义代理主键ID,而是以姓(firstname)字段和名(lastname)字段作为复合主键,那么相应的学生类中不必定义属性ID。而是以firstName属性和lastName作为OID,它的映射代码如下:


      
       
       
       
         ……
         
       
         <composite-
         id>
         
       
         <key-property
         name
         =
         "firstName"
         column
         =
         "firstname"
         type
         =
         "string"
         >
         
       
               <
         key-property
         name
         =
         "lastName"
         column
         =
         "lastname"
         type
         =
         "string"
         >
         
       
         </composite-
         id
         >
         
       
         ……
         
       
      


    注意:此时的student类因为带有复合的OID,这个类必须实现java.io.Serializable接口,用firstName和lastName这两个属性重写equals()和hashcode()方法。


    还有一种方式是先定义单独的主键类,然后在Student类中定义该主键类的一个属性。在此不再赘述。






      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 10:40 , Processed in 0.322796 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表