Hibernate4之JPA規範配置詳解

@Table 

Table用來定義entity主表的name,catalog,schema等屬性。 
屬性說明: 
  • name:表名
  • catalog:對應關係數據庫中的catalog
  • schema:對應關係數據庫中的schema
  • UniqueConstraints:定義一個UniqueConstraint數組,指定須要建惟一約束的列.UniqueConstraint定義在Table或SecondaryTable元數據裏,用來指定建表時須要建惟一約束的列。下面是指定2個字段要惟一約束.
Example:
    @Entity
    @Table(
        name="EMPLOYEE",
        uniqueConstraints=
            @UniqueConstraint(columnNames={"EMP_ID", "EMP_NAME"})
    )
    public class Employee { ... }

@ID 和 @GeneratedValue

經過annotation來映射hibernate實體的,基於annotation的hibernate主鍵標識爲@Id, 
其生成規則由@GeneratedValue設定的.這裏的@id和@GeneratedValue都是JPA的標準用法, 
JPA提供四種標準用法,由@GeneratedValue的源代碼能夠明顯看出. java

@Target({METHOD, FIELD})
@Retention(RUNTIME)

public @interface GeneratedValue {

    GenerationType strategy() default AUTO;

    String generator() default "";
}
其中GenerationType: 
package javax.persistence;

public enum GenerationType {

    TABLE,

    SEQUENCE,

    IDENTITY,

    AUTO
}
JPA提供的四種標準用法爲TABLE,SEQUENCE,IDENTITY,AUTO. 
  • TABLE:使用一個特定的數據庫表格來保存主鍵。 
  • SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。 
  • IDENTITY:主鍵由數據庫自動生成(主要是自動增加型) 
  • AUTO:主鍵由程序控制(也是默認的,在指定主鍵時,若是不指定主鍵生成策略,默認爲AUTO)
@Id
    @GeneratedValue
    private Long id;

四種數據庫的支持狀況以下: mysql

數據庫名稱 sql

支持的id策略 數據庫

mysql 數組

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

oracle 框架

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

postgreSQL ui

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

kingbase

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

@GeneratedValue:主鍵的產生策略,經過strategy屬性指定。

  主鍵產生策略經過GenerationType來指定。GenerationType是一個枚舉,它定義了主鍵產生策略的類型。

  一、AUTO 自動選擇一個最適合底層數據庫的主鍵生成策略。如MySQL會自動對應auto increment。這個是默認選項,即若是隻寫@GeneratedValue,等價於@GeneratedValue(strategy=GenerationType.AUTO)。

  二、IDENTITY 表自增加字段,Oracle不支持這種方式。

  三、SEQUENCE 經過序列產生主鍵,MySQL不支持這種方式。

  四、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位的字符串,是惟一的值。最通用的,適用於全部數據庫。

相關文章
相關標籤/搜索