HIbernate第二课--基本注解,主键生成策略

一 基本注解
二 主键生成策略

(一) 字段映射处理
1.1 不需要(持久化)persistence的对象
@Trasient注解:
   
   
@Transient
public String getTitle() {
return title;
}

1.2 映射日期与时间类型,指定时间精度
@Temporal(value=TemporalType)来注解表示日期和时间精度
TemporalType值:
TemporalType.TIME STMAP   表示 yyyy-MM-dd HH:mm:ss.S
TemporalType.DATE: 表示yyyy-MM-dd
TemporalType.TIME:表示HH:mm:ss
注意:hibernate日期时间类型有:date, time, timestamp,当然您也可以使用Java包装类 

1.3 映射枚举类型

使用@Enumerated(value=EnumType)来注解表示此成员属性为枚举映射到数据库

 其中EnumType有二个值:

①EnumType.STRING  表示直接将枚举名称存入数据库

②EnumType.ORDINAL 表示将枚举所对应的数值存入数据库


1.4 将对象模型转换成关系模型
   
   
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
/**
* Hibernate工具<br/>
* 将对象模型生成关系模型(将对象生成数据库中的表)
* 把hbm映射文件(或Annotation注解)转换成DDL
* 生成数据表之前要求已经存在数据库
* 注:这个工具类建立好后,以后就不用建立了。以后直接Copy来用。
* @author wjt276
* @version 1.0 2009/10/16
*/
public classExportDB {
public static voidmain(String[] args){
/*org.hibernate.cfg.Configuration类的作用:
*读取hibernate配置文件(hibernate.cfg.xml或hiberante.properties)的.
*new Configuration()默认是读取hibernate.properties
*所以使用newConfiguration().configure();来读取hibernate.cfg.xml配置文件
*/
Configuration cfg = new AnnotationConfiguration().configure();
/*org.hibernate.tool.hbm2ddl.SchemaExport工具类:
*需要传入Configuration参数
*此工具类可以将类导出生成数据库表
*/
SchemaExport export = newSchemaExport(cfg);
/** 开始导出
*第一个参数:script是否打印DDL信息
*第二个参数:export是否导出到数据库中生成表
*/
export.create(true, true);
}}

(二) 主键生成策略
主键生成策略
@GeneratedValue(strategy=GenerationType)
Hibernate 默认总共支持 13 种生成策略 : 
1. increment        2.  identity        3. sequence
4. hilo                  5. seqhilo         6. uuid
7. uuid.hex          8. guid             9. native
10. assigned       11. select         12. foreign        13. sequence-identity

1. identity 自然递增
支持 DB2,MySQL,SQL Server,Sybase 和HypersonicSQL 数据库, 用于为 long 或 short 或 int 类型生成唯一标识。它依赖于底层不同的数据库,
       与 Hibernate 和 程序员无关。
    
    
@Id
@GenericGenerator ( name = "idGenerator" , strategy = "identity" )  
@GeneratedValue ( generator = "idGenerator" )  

2 sequence 序列
支持  Oracle ,DB2,PostgreSql,SAPDb 等数据库,用于为 long 或 short 或 int 类型生成唯一标识。它需要底层数据库的支持,
1. 在数据库创建一个sequence
       并由数据库来维护这个 sequence 序列。

2.1 方法一
    
    
@Id
@GenericGenerator ( name = "idGenerator" , strategy = "sequence" ,  
parameters = { @Parameter ( name = "sequence" , value = "seq_name" )})  
@GeneratedValue ( generator = "idGenerator" )  

注意 : 该策略要求设定序列名,否则 hibernate 将无法找到,这将引致抛出异常 :

org.hibernate.exception.SQLGrammarException: could not get next sequence value

2.2 方法二

     
     
@Entity
@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB")
public class Teacher {
private int id;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
public int getId() {
return id;
}}

注意:此生成策略不支持MySQL(因为mysql不支持sequence)

3. native 
需底层数据库的支持,对于 MySQL,SQL Server 采用 identity 的生成策略,对于 Oracle,则采用 sequence 策略。
    
    
@Id
@GenericGenerator ( name = "idGenerator" , strategy = "native" )  
@GeneratedValue ( generator = "idGenerator" )  

4. increment 自然递增
   与 identity 策略不同的是 ,该策略不依赖于底层数据库,而依赖于 hibernate 本身,用于为 long 或 short 或 int 类型生成唯一标识。
       主键计数器是由 hibernate 的一个实例来维护,每次自增量为 1,但在集群下不能使用该策略,
       否则将引起主键冲突的情况,该策略适用于所有关系型数据库使用。

    
    
@Id
@GenericGenerator ( name = "idGenerator" , strategy = "increment" )  
@GeneratedValue ( generator = "idGenerator" )  

5. uuid 32位16进制的字符串
  采用128位UUID算法生成主键,能够保证网络环境下的主键唯一性,也就能够保证在不同数据库及不同服务器下主键的唯一性。
       uuid 最终被编码成一个32位16进制数的字符串,
       占用的存储空间较大。用于为 String 类型生成唯一标识,适用于所有关系型数据库。

    
    
@Id
@GenericGenerator ( name = "idGenerator" , strategy = "uuid" )  
@GeneratedValue ( generator = "idGenerator" )  

6. assigned
该策略要求程序员必须自己维护和管理主键,当有数据需要存储时,程序员必须自己为该数据分配指定一个主键ID值,
如果该数据没有被分配主键ID值或分配的值存在重复,则该数据都将无法被持久化且会引起异常的抛出。

    
    
@Id
@GenericGenerator ( name = "idGenerator" , strategy = "assigned" )  
@GeneratedValue ( generator = "idGenerator" )  

7. table
  原理:就是在数据库中建立一个表,这个表包含两个字段,一个字段表示名称,另一个字段表示值。每次在添加数据时,使用第一个字段的名称,来取值作为添加数据的ID,然后再给这个值累加一个值再次存入数据库,以便下次取出使用。
Table主键生成策略的定义:
   
   
@javax.persistence.TableGenerator(
name="Teacher_GEN", //生成策略的名称
table="GENERATOR_TABLE", //在数据库生成表的名称
pkColumnName = "pk_key", //表中第一个字段的字段名 类型为varchar,key
valueColumnName = "pk_value", //表中第二个字段的字段名 int ,value
pkColumnValue="teacher", //这个策略中使用该记录的第一个字段的值(key值)
initialValue = 1, //这个策略中使用该记录的第二个字段的值(value值)初始化值
allocationSize=1 //每次使用数据后累加的数值
)

这样执行后,手动数据库建立一个表,语句如下:

 create table GENERATOR_TABLE (pk_key varchar(255),pk_value integer )


结构:

并且表建立好后,自动插入了一个记录,如下:


注:这条记录的pk_value值为2,是因为刚刚做例程序时,已经插入一条记录了。初始化时为

    
    
@Entity
@javax.persistence.TableGenerator(
name="Teacher_GEN", //生成策略的名称
table="GENERATOR_TABLE", //在数据库生成表的名称
pkColumnName = "pk_key", //表中第一个字段的字段名 类型为varchar,key
valueColumnName = "pk_value", //表中第二个字段的字段名 int ,value
pkColumnValue="teacher", //这个策略中使用该记录的第一个字段的值(key值)
initialValue = 1, //这个策略中使用该记录的第二个字段的值(value值)初始化值
allocationSize=1 //每次使用数据后累加的数值
)
public class Teacher {
private int id;
@Id
@GeneratedValue(strategy=GenerationType.TABLE,generator="Teacher_GEN")
public int getId() {
return id;}}

注意:这样每次在添加Teacher记录时,都会先到GENERATOR_TABLE表取pk_key=teacher的记录后,使用pk_value值作为记录的主键。然后再给这个pk_value字段累加1,再存入到GENERATOR_TABLE表中,以便下次使用。

    这个表可以给无数的表作为主键表,只是添加一条记录而以(需要保证table、pkColumnName、valueColumnName三个属性值一样就可以了。),这个主键生成策略可以跨数据库平台。

----------------------------------------------------------------------------------------
hibernate提供多种主键生成策略,有点是类似于JPA,有的是hibernate特有: 
native: 对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用)。 
uuid: 采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。占用空间大(字符串类型)。 
hilo: 使用hilo生成策略,要在数据库中建立一张额外的表,默认表名为hibernate_unique_key,默认字段为integer类型,名称是next_hi(比较少用)。 
assigned: 在插入数据的时候主键由程序处理(很常用),这是 <generator>元素没有指定时的默认生成策略。等同于JPA中的AUTO。 
identity: 使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用)。 
          等同于JPA中的INDENTITY。 
select: 使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)。 
sequence: 调用底层数据库的序列来生成主键,要设定序列名,不然hibernate无法找到。 
seqhilo: 通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持 Sequence 的数据库,如 Oracle(比较少用) 
increment: 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。 
foreign: 使用另外一个相关联的对象的主键。通常和<one-to-one>联合起来使用。 
guid: 采用数据库底层的guid算法机制,对应MYSQL的uuid()函数,SQL Server的newid()函数,ORACLE的rawtohex(sys_guid())函数等。 
uuid.hex: 看uuid,建议用uuid替换。 
sequence-identity: sequence策略的扩展,采用立即检索策略来获取sequence值,需要JDBC3.0和JDK4以上(含1.4)版本 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值