天天看點

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。

繼續閱讀