Hibernate annotation 学习笔记(5)

2018-11-28 15:49

Hibernate—annotation 学习笔记 第21页 共109页

sequence

在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。(数据库自增)

hilo

使用一个高/低位算法高效的生成long, short 或者 int类型的标识符。给定一个表和字段(默认分别是

hibernate_unique_key 和next_hi)作为高位值的来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。

seqhilo

使用一个高/低位算法来高效的生成long, short 或者 int类型的标识符,给定一个数据库序列(sequence)的名字。 uuid

用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串,它的生成是由hibernate生成,一般不会重复。

UUID包含:IP地址,JVM的启动时间(精确到1/4秒),系统时间和一个计数器值(在JVM中唯一)。 在Java代码中不可能获得MAC地址或者内存地址,所以这已经是我们在不使用JNI的前提下的能做的最好实现了

guid

在MS SQL Server 和 MySQL 中使用数据库生成的GUID字符串。 native

根据底层数据库的能力选择identity, sequence 或者hilo中的一个。(数据库自增) assigned

让应用程序在save()之前为对象分配一个标示符。这是 元素没有指定时的默认生成策略。(如果是手动分配,则需要设置此配置)

select

通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。 foreign

使用另外一个相关联的对象的标识符。通常和联合起来使用。 二、 annotateon方式

使用@GeneratedValue(strategy=GenerationType)注解可以定义该标识符的生成策略

Strategy有四个值:

① 、AUTO - 可以是identity column类型,或者sequence类型或者table类型,取决于不同的底层数据库.

相当于native

② 、TABLE - 使用表保存id值 ③ 、IDENTITY - identity column ④ 、SEQUENCE - sequence

注意:auto是默认值,也就是说没有后的参数则表示为auto 1、AUTO默认

@Id @GeneratedValue public int getId() { } 或 @Id @GeneratedValue(strategy=GenerationType.AUTO) public int getId() { return id; } 1、 对于mysql,使用auto_increment 2、 对于oracle使用hibernate_sequence(名称固定) return id; Hibernate—annotation 学习笔记 第22页 共109页

2、IDENTITY

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) public int getId() { } 对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。 (数据库自增)

注意:此生成策略不支持Oracle

3、SEQUENCE

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE) public int getId() { } return id; return id; 在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。(数据库自增)

注意:此生成策略不支持MySQL

4、为Oracle指定定义的Sequence

a)、首先需要在实体类前面申明一个Sequence如下:

方法:@SequenceGenerator(name=\,sequenceName=\)

参数注意:SEQ_Name:表示为申明的这个Sequence指定一个名称,以便使用

SEQ_DB_Name:表示为数据库中的Sequence指定一个名称。 两个参数的名称可以一样。

@Entity @SequenceGenerator(name=\,sequenceName=\) public class Teacher { ?? } b)、然后使用@GeneratedValue注解

方法:@GeneratedValue(strategy=GenerationType.SEQUENCE,generator=\) 参数:strategy:固定为GenerationType.SEQUENCE

Generator:在实体类前面申明的sequnce的名称

@Entity @SequenceGenerator(name=\,sequenceName=\) public class Teacher { private int id; @Id @GeneratedValue(strategy=GenerationType.SEQUENCE,generator=\) public int getId() { }} return id; Hibernate—annotation 学习笔记 第23页 共109页

5、TABLE - 使用表保存id值 原理:就是在数据库中建立一个表,这个表包含两个字段,一个字段表示名称,另一个字段表示值。每次在添加数据时,使用第一个字段的名称,来取值作为添加数据的ID,然后再给这个值累加一个值再次存入数据库,以便下次取出使用。 Table主键生成策略的定义: @javax.persistence.TableGenerator( ) 这样执行后,会在数据库建立一个表,语句如下: create table GENERATOR_TABLE (pk_key varchar(255),pk_value integer ) 结构: name=\, //生成策略的名称 //在数据库生成表的名称 //表中第一个字段的字段名 类型为varchar,key //这个策略中使用该记录的第一个字段的值(key值) //这个策略中使用该记录的第二个字段的值(value值)初始化值 table=\, pkColumnName = \, pkColumnValue=\, initialValue = 1, allocationSize=1 valueColumnName = \, //表中第二个字段的字段名 int ,value //每次使用数据后累加的数值 并且表建立好后,就插入了一个记录,如下: 注:这条记录的pk_value值为2,是因为刚刚做例程序时,已经插入一条记录了。初始化时为1。 使用TABLE主键生成策略: @Entity @javax.persistence.TableGenerator( ) public class Teacher { private int id; @Id @GeneratedValue(strategy=GenerationType.TABLE,generator=\Teacher_GEN\) public int getId() { return id;}} name=\, //生成策略的名称 //在数据库生成表的名称 //表中第一个字段的字段名 类型为varchar,key //表中第二个字段的字段名 int ,value //这个策略中使用该记录的第一个字段的值(key值) //这个策略中使用该记录的第二个字段的值(value值)初始化值 table=\, pkColumnName = \, pkColumnValue=\, initialValue = 1, allocationSize=1 valueColumnName = \, //每次使用数据后累加的数值 注意:这样每次在添加Teacher记录时,都会先到GENERATOR_TABLE表取pk_key=teacher的记录后,使用pk_value值作为记录的主键。然后再给这个pk_value字段累加1,再存入到GENERATOR_TABLE表中,以便下次使用。 这个表可以给无数的表作为主键表,只是添加一条记录而以(需要保证table、pkColumnName、valueColumnName三个属性值一样就可以了。),这个主键生成策略可以跨数据库平台。 Hibernate—annotation 学习笔记 第24页 共109页

三、 联合主键

复合主键(联合主键):多个字段构成唯一性。

1、xml方式

a) 实例场景:核算期间

// 核算期间 public class FiscalYearPeriod { } 复合主键的映射,一般情况把主键相关的属性抽取出来单独放入一个类中。而这个类是有要求的:必需实现序列化接口(java.io.Serializable)(可以保存到磁盘上),为了确定这个复合主键类所对应对象的唯一性就会产生比较,对象比较就需要复写对象的hashCode()、equals()方法(复写方法如下图片),然后在类中引用这个复合主键类 private int fiscalYear; //核算年 private int fiscalPeriod; //核算月 private Date beginDate; //开始日期 private Date endDate; //结束日期 private String periodSts; //状态 public int getFiscalYear() { } public void setFiscalYear(int fiscalYear) { } public int getFiscalPeriod() { return fiscalPeriod;} public void setFiscalPeriod(int fiscalPeriod) { } public Date getBeginDate() {return beginDate;} public void setBeginDate(Date beginDate) { this.beginDate = beginDate; } public Date getEndDate() {return endDate;} public void setEndDate(Date endDate) { this.endDate = endDate; } public String getPeriodSts() { return periodSts;} public void setPeriodSts(String periodSts) {this.periodSts = periodSts;} this.fiscalPeriod = fiscalPeriod; this.fiscalYear = fiscalYear; return fiscalYear; Hibernate—annotation 学习笔记 第25页 共109页

b) 复合主键类:

复合主键必需实现java.io.Serializable接口

public class FiscalYearPeriodPK implements java.io.Serializable { private int fiscalYear;//核算年 private int fiscalPeriod;//核算月 public int getFiscalYear() { } public void setFiscalYear(int fiscalYear) { } public int getFiscalPeriod() { } public void setFiscalPeriod(int fiscalPeriod) { } this.fiscalPeriod = fiscalPeriod; return fiscalPeriod; this.fiscalYear = fiscalYear; return fiscalYear; @Override public int hashCode() { } @Override public boolean equals(Object obj) { }} if (this == obj) return true; return false; return false; if (obj == null) if (getClass() != obj.getClass()) FiscalYearPeriodPK other = (FiscalYearPeriodPK) obj; if (fiscalPeriod != other.fiscalPeriod) return false; return false; if (fiscalYear != other.fiscalYear) return true; final int prime = 31; int result = 1; result = prime * result + fiscalPeriod; result = prime * result + fiscalYear; return result;


Hibernate annotation 学习笔记(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:儿童文明礼仪小故事(共4篇)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: