1. 程式人生 > >hibernate註解整理

hibernate註解整理

  • @Entity ——將一個類宣告為一個實體bean(即一個持久化POJO類)
  • @Id ——註解聲明瞭該實體bean的標識屬性(對應表中的主鍵)。
  • @Table ——註解聲明瞭該實體bean對映指定的表(table),目錄(catalog)和schema的名字。
  • @Column ——註解聲明瞭屬性到列的對映。該註解有如下的屬性:

    name 可選,列名(預設值是屬性名)

    unique 可選,是否在該列上設定唯一約束(預設值false)

    nullable 可選,是否設定該列的值可以為空(預設值false)

    insertable 可選,該列是否作為生成的insert語句中的一個列(預設值true)

    updatable 可選,該列是否作為生成的update語句中的一個列(預設值true)

    columnDefinition 可選,為這個特定列覆蓋sql ddl片段(這可能導致無法在不同資料庫間移植)

    table 可選,定義對應的表(預設為主表)

    length 可選,列長度(預設值255)

    precision 可選,列十進位制精度(decimal precision)(預設值 0

    scale 可選,如果列十進位制數值範圍(decimal scale)可用,在此設定(預設值0)。

  • @GeneratedValue ——註解聲明瞭主鍵的生成策略。該註解有如下屬性
    strategy 指定生成的策略(JPA定義的),這是一個GenerationType。預設是GenerationType. AUTO
    GenerationType.AUTO 主鍵由程式控制
    GenerationType.TABLE 使用一個特定的資料庫表格來儲存主鍵
    GenerationType.IDENTITY 主鍵由資料庫自動生成(主要是自動增長型別)
    GenerationType.SEQUENCE 根據底層資料庫的序列來生成主鍵,條件是資料庫支援序列。這個值要與generator一起使用,generator 指定生成主鍵使用的生成器(可能是orcale中的序列)。
    generator

    指定生成主鍵使用的生成器
    例如:

@Id @GeneratedValue(generator = “system-uuid”)
@GenericGenerator(name = “system-uuid”, strategy = “uuid”)
@Column(name = “ID”, unique = true, nullable = false)
public StringgetId() {
return this.id;
}

其中generator = “system-uuid”,生成器的名字要與GenericGenerator裡name名字一致。

GenericGenerator
聲明瞭一個hibernate的主鍵生成策略。支援十三種策略。該註解有如下屬性:
name 指定生成器名稱。
strategy 指定具體生成器的類名(指定生成策略)。
parameters 得到strategy指定的具體生成器所用到的引數。
其十三種策略(strategy屬性的值)如下:
● native
對於orcale採用Sequence方式,對於MySQL和SQL Server採用identity(處境主鍵生成機制),native就是將主鍵的生成工作將由資料庫完成,hibernate不管(很常用)
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “native”)
● uuid
採用128位的uuid演算法生成主鍵,uuid被編碼為一個32位16進位制數字的字串。佔用空間大(字串型別)。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “uuid”)
● hilo
要在資料庫中建立一張額外的表,預設表名為hibernate_unque_key,預設欄位為integer型別,名稱是next_hi(比較少用)。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “hilo”)
● assigned
在插入資料的時候主鍵由程式處理(很常用),這是元素沒有指定時的預設生成策略。等同於JPA中的AUTO。可用於設定id為字串型別,可用於手工賦值。
例如:@id
@GeneratedValue(generator = “sid”)
@GenericGenerator(name = “sid”, strategy = “assigned”)
@Column(length=8)
private String id;
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “assigned”)
● identity
使用SQL Server和MySQL的自增欄位,這個方法不能放到Oracle中,Oracle不支援自增欄位,要設定sequence(MySQL和SQL Server中很常用)。等同於JPA中的IDENTITY
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “identity”)
● select
使用觸發器生成主鍵(主要用於早期的資料庫主鍵生成機制,少用)
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “select”)
● sequence
呼叫謹慎資料庫的序列來生成主鍵,要設定序列名,不然hibernate無法找到。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “sequence”, parameters = { @Parameter(name = “sequence”, value = “seq_payablemoney”) })
● seqhilo
通過hilo演算法實現,但是主鍵歷史儲存在Sequence中,適用於支援Sequence的資料庫,如Orcale(比較少用)。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “seqhilo”, parameters = { @Parameter(name = “max_lo”, value = “5”) })
● increnment
插入資料的時候hibernate會給主鍵新增一個自增的主鍵,但是一個hibernate例項就維護一個計數器,所以在多個例項執行的時候不能使用這個方法。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “increnment”)
● foreign
使用另一個相關的物件的主鍵。通常和@OneToOne聯合起來使用。
例:@Id
@GeneratedValue(generator = “idGenerator”)
@GenericGenerator(name = “idGenerator”, strategy = “foreign”, parameters = { @Parameter(name = “property”, value = “info”) })
Integer id;

   @OneToOne
   EmployeeInfo info;

● guid
採用資料庫底層的guid演算法機制,對應MySQL的uuid()函式,SQL Server的newid()函式,ORCALE的rawtohex(sys_guid())函式等。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “guid”)
● uuid.hex
參見uuid,建議用uuid替換。
● sequence-identity
sequence策略的擴充套件,採用立即檢索策略來獲取sequence值,需要JDBC3.0和JDK4以上(含1.4)版本。
例:@GeneratedValue(generator = “paymentableGenerator”)
@GenericGenerator(name = “paymentableGenerator”, strategy = “sequence-identity”, parameters = { @Parameter(name = “sequence”, value = “seq_payablemoney”) })

  • @Transient
    聲明瞭非持久化屬性,即資料庫中沒有相應的對映欄位,是一個普通屬性。

  • @Temporal 聲明瞭日期型別。 TemporalType.DATE 日期,例:2011-04-12
    TemporalType.TIME 時間,例:22:50:30 TemporalType.TIMESTAMP
    日期和時間,例:2011-04-12 22:51:30

    1. @Version 聲明瞭對樂觀鎖定的支援 例:@Version
      @Column(name=”OPTLOCK”)
      public Integer getVersion() { … } 上面這個例子中,version屬性將對映到 OPTLOCK列,entity manager使用該欄位來檢測更新衝突(防止更新丟失,請參考last-commit-wins策略)。
      根據EJB3規範,version列可以是numeric型別(推薦方式)也可以是timestamp型別。Hibernate支援任何自定義型別,只要該型別實現了UserVersionType。