JPA ID生成策略(轉---)
尊重原創: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 |
oracle |
strategy=GenerationType.AUTO 不支持GenerationType.IDENTITY |
postgreSQL |
GenerationType.TABLE |
kingbase |
GenerationType.TABLE |
@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生成策略(轉---)