一、類注解
1、@entity修飾一個實體類,接受一個name屬性作為該實體類名稱,可省略默認為該類名
2、@Table指定持久化類所映射的表名,可接受以下屬性
catalog:可省略,用於設置將持久化類所映射的表放入指定的catalog中,若省略,則放入默認的catalog中。
indexs:可省略,為持久化類設置索引,屬性值為一個@index注解數組
@index :用於為數據表設置索引,接受以下熟悉
columnList :不可省略,設置對那些列建立索引,可指定多個數據列,指定多個列時用逗號將多個列隔開。如:@Index(columnList = "id,name,pass"),同時為id,name,pass設置索引。
name:索引名,可省略
unique:可省略,設置該索引是否唯一,只能取,true 或false,默認true
name: 該實體類所映射的表名,若省略,默認與類名一致。
schema:將該持久化所映射的表放入schema中,若省略則放入默認schema中。
uniqueConstraints:為持久化類所映射的表指定唯一約束,值為一個@UniqueConstraint注解數組。可省略。
@UniqueConstraint:為數據表制定唯一約束,需指定一個columnNames屬性,該屬性為一個字符串數組。
3.@Access用於改變Hibernate的屬性訪問策略,屬性支持AccessType.PROPERTY, AccessType.FIELD,默認為AccessType.PROPERTY
AccessType.PROPERTY:使用getter/setter方法訪問屬性。
AccessType.FIELD:直接通過成員變量訪問屬性。
4.@DynamicInsert:指定用於插入時的SQL語句是否在運行是動態生成,並且只插入那些非空字段,默認false,開啟將導致hibernate花費更多時間來生成SQL語句。
5.@DynamicUpdate:指定用於更新時的SQL語句是否在運行是動態生成,並且只更新那些變過字段,默認false,開啟將導致hibernate花費更多時間來生成SQL語句。
6.@SelectBeforeUpdate:指定hibernate在更新時持久化對象時是否先進行一次查詢,默認false。若查詢的狀態與當前狀態一致則不會調用update保存狀態。
7.@Where:該注解的clause屬性可指定一個附加的SQL語句過濾條件,即在采用load()或者get()和其他查詢方法時,只有符合該where條件的才會被加載。該注解只會在查詢時生效。
8.@BatchSize:當hibernate抓取集合或者延遲加載時,指定每次加載size數量。
9.@OptimisticLocking:指定樂觀鎖策略,該注解的type屬性接受
OptimisticLockType.VERSION:檢查version/timestamp字段
OptimisticLockType.ALL:檢查全部字段
OptimisticLockType.DIRTY:之檢查修改過的字段
OptimisticLockType.NONE:不使用樂觀鎖
默認為:OptimisticLockType.VERSION
10.@Check:通過屬性constraints指定一個SQL表達式,用於給對應的表指定一個check約束。
二、屬性注解
1、@column指定某個屬性所映射的數據列的詳細信息。接受一下常用屬性
2、@Formula:該注解的value屬性接受一個SQL表達式,被該注解修飾的字段會根據此SQL計算,持久化表中沒有與此屬性對應的列。該屬性只會在讀取是生效
注意:value=“(SQL)”中的括號不可省略
SQL中的列名與表名都應與數據庫中的表名和列名對應
在SQL中使用參數可以直接將當前類的屬性傳入
3、@Generated:設置該屬性映射的列的值是否又數據庫生成,該注解的value可接受GenerationTime.NEVER(不有數據庫生成),GenerationTime.ALWAYS(插入和更新時均生成),GenerationTime.INSERT(只在插入時更新),該屬性需要底層數據庫中有相應的觸發器。在數據庫生成後會讀取這些值。
4、@Transient:用來修飾不想持久保存的屬性。
5、@Enumerated:修飾枚舉類型,該注解的value屬性接受EnumType.STRING(底層保存字符串)和EnumType.ORDINAL(底層保存編號)
6、@Lob,@Basic:修飾大數據類型屬性(Clob,Blob),當屬性為byte[],Byte[],java.io.Serializable類型時@Lob會在底層映射Blob列,當屬性為char[],Character[],java.lang.String時@Lob會在底層映射為Clob列。
@Basic接受下面兩個屬性:
fetch:是否延遲加載,該屬性接受FetchType.EAGER(立即加載)、FetchType.LAZY(延遲加載)
optional:指定映射列是否允許使用null。
7、@Temporal:用於修飾日期類型,該注解的value接受三個值:
TemporalType.TIME(只取時間部分),TemporalType.DATE(只取日期部分),TemporalType.TIMESTAMP(時間戳)
三、主鍵生成相關
對於主鍵使用@Id簡單標注即可,不需要任何屬性
可使用@GeneratedValue來修飾實體的標記屬性,可指定如下屬性:
strategy:指定hibernate的主鍵生成策略,可以省略,接受下列四個值:
GenerationType.AUTO自動選擇合適的底層數據庫逐漸生成策略,這是默認值。
GenerationType.INDENTITY:對於MYSQL,SQL Server這樣的數據庫,選擇自增長的生成策略。
GenerationType.SEQUENCE:對於Oracle這樣基於Sequence的主鍵生成策略。應與@SequenceGenerator一起使用。
GenerationType.TABLE:使用輔助表來生成主鍵,應與@TableGenerator一起使用。
generator:當使用GenerationType.SEQUENCE或GenerationType.TABLE時指定生成器的名稱。
對於@SequenceGenerator可指定下表屬性:
屬性 是否必須 說明 name 是 指定該主鍵生成器的名稱 catalog 否 用於設置將持久化類所映射的表放入指定的catalog中,若省略,則放入默認的catalog中。 schema 否 用於設置將持久化類所映射的表放入指定的schema中,若省略,則放入默認的schema中。 initialValue 否 指定底層Sequence的初始值。對於Oracle該屬性指定的整數值將作為定義Sequence時的start with值 sequenceName 否 指定底層Sequence的名稱 allocationSize 否 指定底層Sequence每次生成主鍵值的個數。
對於@TableGenerator可指定下表屬性,該注解會在底層數據庫中額外生成一個輔助表。
uniqueConstraints 否 該屬性為一個@UniqueConstraint數組,用於為輔助表創建唯一約束 name 是 指定該主鍵生成器的名稱 allocationSize 否 指定底層輔助表每次生成主鍵值的個數 catalog 否 用於設置將持久化類所映射的表放入指定的catalog中,若省略,則放入默認的catalog中 schema 否 用於設置將持久化類所映射的表放入指定的schema中,若省略,則放入默認的schema中 table 否 指定輔助表的名稱 initialValue 否 將指定值作為底層輔助表的起始值。默認0. pkColumnName 否 指定存放主鍵名的列名 pkcolumnValue 否 指定主鍵名 valueColumnName 否 指定存放主鍵值的列名 indexs 否 指定一個@Index數組,為輔助表創建索引
使用hibernate的@GenericGenerator注解定義主鍵生成器,該注解接受兩個參數:
name:必須屬性。設置該生成器的名稱,該名稱可以被@GeneratedValue的generator屬性引用。
strategy:必須屬性。設置該生成器的主鍵生成策略。接受以下值:
increment:為long,int,short生成唯一標識,只能在沒有其他進程往同一個表中插入時才能使用。集群中不要使用!
identity:在DB2、MySql、SQL Server、Sybase和HypersonicSQL等有提供identity(自增長)的數據庫中適用。
Sequence:在DB2、PostgreSQL、Oracle、SAP DB、McKoi等有提供Sequence支持的數據庫中適用。
hilo:使用一個高/低位算法來生成long、int、short類型的標識符,該標識符在一個數據庫中是唯一的。
seqhilo:使用一個高/低位算法來生成long、int、short類型的標識符,需要給定一個Sequence名,該屬性適用與提供Sequence的數據庫。
uuid:用一個128位的UUID算法來生成字符串類型的標識符,在全網中唯一。該算法根據IP地址、JVM啟動時間、一個計數器值(JVM中唯一)來生成一個32位的字符串
guid:在SQL Server和Mysql中使用數據庫生成的GUID 字符串
native:根據底層數據庫的能力選擇identity、sequenec或者hilo中的一個
assigned:讓應用程序在sava之前為對象分配一個標識符。相當於不使用主鍵生成策略。
select:通過觸發器選擇某個唯一主鍵的行,並返回其主鍵值作為標識屬性值
foreign:直接使用另一個關聯的對象的標識符屬性值(即本持久化對象不生成主鍵)。這種策略只在基於主鍵的1-1關聯映射中有效。