尊重原创:http://tendyming.iteye.com/blog/2024985

JPA ID生成策略

@Table Table用来定义entity主表的name,catalog,schema等属性。 
属性说明:

  • name:表名
  • catalog:对应关系数据库中的catalog
  • schema:对应关系数据库中的schema
  • UniqueConstraints:定义一个UniqueConstraint数组,指定需要建唯一约束的列.UniqueConstraint定义在Table或SecondaryTable元数据里,用来指定建表时需要建唯一约束的列。下面是指定2个字段要唯一约束.

通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 
其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法, 
JPA提供四种标准用法,由@GeneratedValue的源代码可以明显看出.

其中GenerationType:

JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.

  • TABLE:使用一个特定的数据库表格来保存主键。
  • SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
  • IDENTITY:主键由数据库自动生成(主要是自动增长型)
  • AUTO:主键由程序控制(也是默认的,在指定主键时,如果不指定主键生成策略,默认为AUTO)
四种数据库的支持情况如下:

数据库名称

支持的id策略

mysql

GenerationType.TABLE
GenerationType.AUTO
GenerationType.IDENTITY
不支持GenerationType.SEQUENCE

oracle

strategy=GenerationType.AUTO
GenerationType.SEQUENCE
GenerationType.TABLE
不支持GenerationType.IDENTITY

postgreSQL

GenerationType.TABLE
GenerationType.AUTO
GenerationType.IDENTITY
GenerationType.SEQUENCE
都支持

kingbase

GenerationType.TABLE
GenerationType.SEQUENCE
GenerationType.IDENTITY
GenerationType.AUTO
都支持

@GeneratedValue:主键的产生策略,通过strategy属性指定。

  主键产生策略通过GenerationType来指定。GenerationType是一个枚举,它定义了主键产生策略的类型。

  1、AUTO 自动选择一个最适合底层数据库的主键生成策略。如MySQL会自动对应auto increment。这个是默认选项,即如果只写@GeneratedValue,等价于@GeneratedValue(strategy=GenerationType.AUTO)。

  2、IDENTITY 表自增长字段,Oracle不支持这种方式。

  3、SEQUENCE 通过序列产生主键,MySQL不支持这种方式。

  4、TABLE 通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。不同的JPA实现商生成的表名是不同的,如 OpenJPA生成openjpa_sequence_table表,Hibernate生成一个hibernate_sequences表,而TopLink则生成sequence表。这些表都具有一个序列名和对应值两个字段,如SEQ_NAME和SEQ_COUNT。

  在我们的应用中,一般选用@GeneratedValue(strategy=GenerationType.AUTO)这种方式,自动选择主键生成策略,以适应不同的数据库移植。

  如果使用Hibernate对JPA的实现,可以使用Hibernate对主键生成策略的扩展,通过Hibernate的@GenericGenerator实现。

  @GenericGenerator(name = "system-uuid", strategy = "uuid") 声明一个策略通用生成器,name为"system-uuid",策略strategy为"uuid"。

  @GeneratedValue(generator = "system-uuid") 用generator属性指定要使用的策略生成器。

  这是我在项目中使用的一种方式,生成32位的字符串,是唯一的值。最通用的,适用于所有数据库。

======================================================================================================================

@Table(name = "scbp_user")//对应数据库中的表名
public class ScbpUser {
/**
* 用户Id
*/
@Id
@Column(name = "Id")
@GeneratedValue(strategy = GenerationType.IDENTITY)//mysql数据库主键策略
private Integer id; /**
* 用户名
*/
@Column(name = "UserName")
private String username; /**
* 登录别名
*/
@Column(name = "Account")
private String account; /**
* 联系电话
*/
@Column(name = "PhoneNumber")
private String phonenumber; /**
* 邮箱
*/
@Column(name = "Email")
private String email; /**
* 身份证、军官证号码
*/
@Column(name = "IdNumber")
private String idnumber; /**
* 是否是正式员工
*/
@Column(name = "IsInformal")
private Boolean isinformal; /**
* 密码
*/
@Column(name = "PasswordHash")
private String passwordhash; /**
* 创建时间
*/
@Column(name = "CreationTime")
private Date creationtime; /**
* 创建人Id
*/
@Column(name = "CreatorUserId")
private Integer creatoruserid; /**
* 最后修改时间
*/
@Column(name = "LastModificationTime")
private Date lastmodificationtime; /**
* 更新人Id
*/
@Column(name = "LastModifierUserId")
private Integer lastmodifieruserid; /**
* 删除标记
*/
@Column(name = "IsDeleted")
private Boolean isdeleted; /**
* 删除时间
*/
@Column(name = "DeletionTime")
private Date deletiontime;

JPA ID生成策略(转---)的更多相关文章

  1. assigned before calling save & JPA id生成策略

    撸了今年阿里.网易和美团的面试,我有一个重要发现.......>>> Ⅰ 关于JPA 主键,自定义生成遇到的问题,愚蠢的笔记 Ⅱ 第一次 报错: ids for this class ...

  2. id生成策略 id工具类

    import java.util.Random; /** * 各种id生成策略 * <p>Title: IDUtils</p> * <p>Description: ...

  3. hibernate(四)ID生成策略

    一.ID生成策略配置 1.ID生成方式在xml中配置方式: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping P ...

  4. 高并发环境下全局id生成策略

    解决方案: 基于Redis的全局id生成策略:(推荐此方法) 基于雪花算法的全局id生成: https://www.cnblogs.com/kobe-qi/p/8761690.html 基于zooke ...

  5. Hibernate系列之ID生成策略

    一.概述 hibernate中使用两种方式实现主键生成策略,分别是XML生成id和注解方式(@GeneratedValue),下面逐一进行总结. 二.XML配置方法 这种方式是在XX.hbm.xml文 ...

  6. 各种id生成策略

    package com.taotao.utils; import java.util.Random; /** * 各种id生成策略 */ public class IDUtils { /** * 图片 ...

  7. 业务ID 生成策略

    业务ID 生成策略,从技术上说,基本要借助一个集中式的引擎来帮忙实现. 为了扩大业务ID生成策略的并发问题,还有更为技巧性的提升. 先来介绍普遍的分布式ID生成策略: 1. 利用DB的自增主键 这里又 ...

  8. Rhythmk 学习 Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略

    Hibernate 加载数据 有get,跟Load 1.懒加载: 使用session.load(type,id)获取对象,并不读取数据库,只有在使用返回对象值才正真去查询数据库. @Test publ ...

  9. 数据库主键ID生成策略

    前言: 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,下面介绍一些常见的ID生成策略. Sequence ID UUID GUID COMB Snowflake 最开始的自增ID为了实现分库 ...

随机推荐

  1. POI 设置Excel样式(转)

    POI 设置Excel样式 POI中可能会用到一些需要设置EXCEL单元格格式的操作小结: 先获取工作薄对象: HSSFWorkbook wb = new HSSFWorkbook(); HSSFSh ...

  2. [Gym101194G][CHINA-Final2016]Pandaria

    题目大意: 给你一个$n(n\le10^5)$个点,$m(m\le2\times10^5)$条边的无向图,每个点有一个颜色$c_i$,每条边有一个边权$w_i$.$q(q\le2\times10^5) ...

  3. 13test04:捕鱼

    #include<iostream> using namespace std; int main() { int fish_sum,flag=1; for(fish_sum=6;flag; ...

  4. jQuery判断一个元素是否为另一个元素的子元素

    判断:当前元素是否是被筛选元素的子元素 jQuery.fn.isChildOf = function(b){ return (this.parents(b).length > 0); }; 判断 ...

  5. Debian、Ubuntu 源列表说明

    转载:http://forum.ubuntu.org.cn/viewtopic.php?t=366506 概貌: 源列表主文件为 /etc/apt/sources.list,另兼取 /etc/apt/ ...

  6. Oracle数据库冷备份与恢复(救命稻草)

    说明,只要是同样系统,同样数据库版本,是可以做冷备恢复.冷备份数据必须是数据库不在open状态下.以oracle11gR2为例. 一.冷备份与冷恢复 具体步骤如下. 1. 复制旧的数据库文件 (1) ...

  7. [Git] Git把Tag推送到远程仓库

    转载: http://blog.csdn.net/hustpzb/article/details/8056518 用git tag来给工程打上标签,但是这个命令只是在本地仓库打标签而已, 为了能把标签 ...

  8. flask的文件上传和下载

    http://flask.pocoo.org/docs/1.0/api/ http://docs.jinkan.org/docs/flask/api.html?highlight=download h ...

  9. Asp.Net Core 缓存的使用(译)

    原文:http://www.binaryintellect.net/articles/a7d9edfd-1f86-45f8-a668-64cc86d8e248.aspx环境:Visual Studio ...

  10. IDEA+MAVEN+testNG(reportNG)

    转载:http://www.cnblogs.com/aikachin/p/7765846.html 参考: http://blog.csdn.net/langsand/article/details/ ...