Hibernate系列学习之映射持久化类--标识符生成策略

一、标识符

理解Java标识和相等性,主键,键生成器,标识符生成器

1.1什么是标识符

1.1.1理解Java标识和相等性
Java标识:
Java对象标识(==)是由Java虚拟机定义的一个概念。如果两个引用都指向相同的内存位置,则他们是完全相同的。
对象相等性:
对象相等性是由类的equals()所定义的一个概念,有时候也成为等效性。
等效性意味着两个不同的实例具有相同的值--相同的状态。例如:如果String的两个不同实例表示了相同序列的字符,则他们就是相等的。
1.1.2数据库标识
什么是数据库标识

现在开始思考,在数据库中如何识别不同表中的不同的记录?(当然,答案就是主键,后续的学习中,你会明白主键其实是一种标识符)

持久化让此情况变得复杂了。
使用对象/关系持久化,其本质,一个持久化实例就是数据库某个表(或多个表)中的一个特定行(或多个行)的内存表示。(换种理解就是,我们现在可以通过一个表和一个主键来确定一条记录)
与Java标识和相等性一起,我们要定义
数据库标识。

数据库标识具体化

数据库标识现在具体化来说就是可以标识某个特定数据库、数据表、字段、记录的标识。比如说,数据库名、数据表名、字段名、记录的主键等等。

1.2为什么要有标识符

为了区分。

二、JPA标识符生成策略

2.1配置键生成器

个人理解:
在一个数据表中有很多的副,比如说主键、外键等等,那么在持久化到Java类中时,就需要特定的标识符来区分不同的副键了,那么生成这些特定的标识符的工具就称作键生成器了。

2.2主键生成器和主键生成策略

2.2.1确定标识符

在JPA中需要使用@Id注解类标记一个实体类的标识符。

2.2.2为标识符赋值

使用@GenarationValue 注解来为标识符赋值。
JPA使用javax.persistence.GenerationType枚举化了几种值生成策略,可以使用@GenerationValue(strategy=…)进行选择。

值生成策略
  • GenerationType.Auto 把主键生成策略交给JPA厂商(Persistence Provider),由它根据具体的数据库选择合适的策略,可以是Table/Sequence/Identity中的一种。假如数据库是Oracle,则选择Sequence。
    如果不特别指定,这是默认的主键生成策略。
  • GenerationType.SEQUENCE Oracle不支持ID子增长列而是使用序列的机制生成主键ID,对此,可以选用序列作为主键生成策略
  • GenerationType.IDENTITY 多数数据库支持IDENTITY列,数据库会在新行插入时自动给ID赋值,这也叫做ID自增长列,比如MySQL中可以在创建表时声明“AUTO_INCREMENT”, 就是一个ID子增长列(此种常用)
  • GenerationType.TABLE 有时候为了不依赖于数据库的具体实现,在不同数据库之间更好的移植,可以在数据库中新建序列表来生成主键,序列表一般包含两个字段:第一个字段引用不 同的关系表,第二个字段是该关系表的最大序号。这样,只需要一张序列就可以用于多张表的主键生成。如果不指定表生成器,JPA厂商会使用默认的表,比如Hibernate在Oracle数据库上会默认使用表hibernate_sequence。
    这种方式虽然通用性最好,所有的关系型数据库都支持,但是由于不能充分利用具体数据库的特性,建议不要优先使用。
2.2.3代码设计
  • GenerationType.AUTO
 @GeneratedValue(strategy = GenerationType.AUTO)
 private long id; 
  • GenerationType.SEQUENCE
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "emailSeq")
@SequenceGenerator(initialValue = 1, name = "emailSeq", sequenceName = "EMAIL_SEQUENCE")
private long id;
  • GenerationType.IDENTITY
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private long id;
  • GenerationType.TABLE
@TableGenerator( name = "emailSeq", table = "MY_PROJECT_SEQUENCE_TABLE", pkColumnName = "SEQUENCE_NAME", valueColumnName = "SEQUENCE_COUNT", initialValue = 1, allocationSize = 1)
@GeneratedValue( strategy = GenerationType.TABLE, generator = "emailSeq")
private long id;

三、Hibernate标识符生成策略

直接贴代码:

代码设计

参照资料:http://blog.csdn.net/yhl_jxy/article/details/50674463

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值