Hibernate映射的基本操作

Hibernate映射的基本操作
                                                                      ++YONG原创,转载请注明
 
       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
使用一个高/低位算法来高效的生成 long, short 或者 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类中定义该主键类的一个属性。在此不再赘述。
 
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值