zoukankan      html  css  js  c++  java
  • JPA的主键生成策略

    数据的唯一性是很平常的要求,但是如果框架不能提供相关的控制而由程序员完全控制是很危险的,在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)

  • 相关阅读:
    Linux防火墙:iptables禁IP与解封IP常用命令
    php7安装 event扩展
    laravel5.5 调用系统自带登陆认证auth
    linux 搭建rap记录
    微信小程序silk格式转码成mp3格式
    抓包软件
    laravel 微信小程序登录 加密解密扩展包
    mysql索引
    sphinx-for-chinese在windows下安装与使用方法
    sphinx增量索引和主索引来实现索引的实时更新
  • 原文地址:https://www.cnblogs.com/heidsoft/p/3836636.html
Copyright © 2011-2022 走看看