1. 程式人生 > >JPA ID生成策略(轉---)

JPA ID生成策略(轉---)

generate 用戶 span cond ads constrain generator link 使用

尊重原創: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個字段要唯一約束.
@ID 和
@GeneratedValue

通過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生成策略(轉---)