数据的唯一性是很平常的要求,但是如果框架不能提供相关的控制而由程序员完全控制是很危险的,在JPA中,有下面四种策略。
A.容器自动生成---GeneratorType.AUTO 
由JPA自动生成
B.使用数据库的自动增长字段生成---GenerationType.IDENTITY
JPA 容器将使用数据库的自增长字段为新增加的实体对象赋唯一值。这种情况下需要数据库提供对自增长字段的支持,SQL Server、MySQL、DB2、Derby等支持。
C.根据数据库序列号(Sequence)生成 ---GenerationType.SEQUENCE
表示使用数据库的序列号为新增加的实体对象赋唯一值。这种情况下需要数据库提供对序列号的支持常用的数据库中,Oracle支持。
D.使用数据库表的字段生成---GenerationType.TABLE
表示使用数据库中指定表的某个字段记录实体对象的标识,通过该字段的增长为新增加的实体对象赋唯一值

比较特殊的地方
1. 使用UUID(两个不同实现版本Hibernate和OpenJPA有点不同)
  OpenJPA
   @GeneratedValue(strategy=GenerationType.AUTO, generator = "uuid")
  Hibernate(Eclipse会提示错误,但是程序是可以运行的)
   @GenericGenerator(name = "test", strategy = "uuid")
   @GeneratedValue(generator = "test")
  
  其实这两种办法我感觉都不是特别好,因为他们跟实现有关系,将来如果要迁移的话会比较麻烦,所以可以直接用java.util.UUID
   user.setUserId(UUID.randomUUID().toString());

2.使用@GeneratedValue(strategy=GenerationType.IDENTITY)
  需要在数据库(Derby)中这样定义字段
  USER_ID  BIGINT  NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)

3.如果使用数据库表的字段生成---GenerationType.TABLE
  对于Hibernate,需要创建生成主键的表,但是OpenJPA不需要,如果没有会自动生成。
  代码如下:
   @TableGenerator(name = "test111", table = "IDTABLE",
                pkColumnName = "KEYID", valueColumnName = "KEYVALUE", pkColumnValue = "TestUSER_ID")
   @GeneratedValue(strategy=GenerationType.TABLE, generator="test111")

CREATE TABLE IDTABLE (
    KEYID VARCHAR(255) NOT NULL,
    KEYVALUE BIGINT,
    PRIMARY KEY (KEYID)
   )

(注:该文为引用,原文地址http://blog.csdn.net/fantian830211/archive/2009/09/11/4544117.aspx)

转载于:https://www.cnblogs.com/heidsoft/p/3836636.html

JPA的主键生成策略相关推荐

  1. jpa 根据主键生成策略获取id_JPA主键生成策略

    @GeneratedValue: 为一个实体类生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键).它有两个属性,分别是strategy和generator. genera ...

  2. jpa 根据主键生成策略获取id_如何在使用JPA和Hibernate时选择id生成策略

    MMTTMM 该API文档都对这个很清楚.所有生成器都实现了org.hibernate.id.IdentifierGenerator接口.这是一个非常简单的界面.一些应用程序可以选择提供自己的专用实现 ...

  3. JPA实体注解与hibernate主键生成策略

    JPA实体注解与hibernate主键生成策略 用hibernate注解开发项目,对于主键的生成策略有些模糊,下面是从新浪网里面看到的一篇关于hibernate注解以及主键生成策略的文章,值得一看: ...

  4. jpa基于按annotation的hibernate主键生成策略

    JPA注解持久化类很方便,需要jar包:ejb3-persistence.jar下载 一.JPA通用策略生成器  通过annotation来映射hibernate实体的,基于annotation的hi ...

  5. JPA 配置UUID主键生成策略

    我们知道oracle 有一种主键生成策略是UUID, 用于生成一个不重复的字符串做为主键. 使用UUID 作为主键可以防止恶意猜测主键, 对数据做非法操作. Hibernate 对此也提供了支持, 会 ...

  6. 基于按annotation的hibernate主键生成策略

    这里讨论代理主键,业务主键(比如说复合键等)这里不讨论. 一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id ...

  7. JavaEE持久层框架对比与hibernate主键生成策略总结

    一.持久层框架对比 ORM框架:即对象关系映射.它把数据库表映射到pojo类,然后通过对类的操作来实现对数据库的增删改查,sql语句自动生成. 对于代码开发者来说,就是在代码里先创建数据库连接对象,然 ...

  8. hibernate 7大主键生成策略详解与对象状态

    一:代理主键_主键自增 1.identity 1.采用底层数据库本身提供的主键生成标识符,条件是数据库支持自动增长数据类型 2.该生成器要求在数据库中把主键定义成为自增长类型.适用于代理主键 2.in ...

  9. Hibernate各种主键生成策略与配置详解 - 真的很详细啊!!

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

最新文章

  1. 用flood测试web服务器响应时间,用Flood测试Web服务器响应时间(1)
  2. 意想不到的JavaScript(每日一题1)
  3. electron 打包把node代理服务打包进去_专题:让C++给node做技术加持(三)编译electron本地模块踩坑记
  4. django 表单html5,我们如何在django管理表单中添加动态html5数据属性
  5. 为什么Python 4.0不会像Python 3.0
  6. 每日英语:Is austerity good for your health?
  7. 一文读懂Redis6的--bigkeys选项源码以及redis-bigkey-online项目介绍
  8. 被国人误传了几千年的八句俗语
  9. 计算机ps屏幕背景颜色怎么换,win7系统ps背景颜色怎么换?七步教您轻松处理
  10. 关于EPCS系列芯片的说明
  11. python网站数据监测_python 网站数据监控
  12. 图像分割-连通区域分析
  13. 2021年软考信息安全工程师下午真题(考生回忆版)
  14. 每日三思:微信小程序多层级父子组件如何在子组件滚动加载
  15. 计算机考研总共多少分,考研计算机要过多少分
  16. 1213:八皇后问题1700:八皇后问题
  17. 这5个“减压”小妙招,在你负重前行的路上会用到!
  18. 基于eBPF的云原生可观测性开源工具Kindling之Kindling-agent 性能测试评估
  19. 中电标协提出并归口:《政务APP评价指标》团体标准开启制订工作
  20. 数据结构003:有效的数独

热门文章

  1. java.lang.NoClassDefFoundError: weblogic/rmi/extensions/DisconnectListener
  2. idea使用过程中的坑
  3. vue2.0:(六)、移动端像素border的实现和整合引入less文件
  4. thinkphp 模板 in
  5. linux基础命令-查看系统状态-free -m以及top命令详解
  6. width 、 height 与 box-sizing : border-box ,content-box 的关系
  7. 错误记录:发送广播是报空指针
  8. 关于spring注入
  9. azure centos 7安装mariadb
  10. Windows Mobile入门