【hibernate】經常使用註解html
轉載:http://www.javashuo.com/article/p-dybuyffv-bz.htmljava
目錄sql
========================================================數據庫
一、@Entity 實體session
二、@Table 表架構
三、@Id 和 @GeneratedValue 主鍵及生成策略app
四、@Column 列ide
五、@DynamicInsert 和 @DynamicUpdate 動態字段函數
六、@Immutable 不變實體測試
七、@Basic 非空約束
八、@NotNull 非空檢查
九、@Access 屬性訪問
十、@Formula 派生屬性
十一、@ColumnTransformer 轉換列值
十二、@Generated 默認值
1三、@Temporal 時序屬性
1四、@CreationTimestamp和@UpdateTimestamp 建立時間戳和更新時間戳
1五、@Enumerated 枚舉類型
1六、@Embeddable 可嵌入組件
1七、@Lob 大數據類型
1八、@Type 類型適配器
1九、@Convert 轉換器
20、@MappedSuperclass 不持久化超類屬性
2一、@AttributeOverrides 和 @AttributeOverride 重寫屬性
2二、@Inheritance 繼承策略
========================================================
一、@Entity 實體
聲明持久化實體,不帶 name 參數時代表和實體名相同,帶參數重寫代表 @Entity(name="ycx_user")
二、@Table 表
重寫表名 @Table(name="ycx_user")
三、@Id 和 @GeneratedValue 主鍵及生成策略
主鍵和主鍵生成策略 @GeneratedValue(generator="id_generator") 或者 @GeneratedValue(strategy=GenerationType.SEQUENCE)
四、@Column 列
name="列名"
table=「列屬表名」
nullable=false 不能爲空,生成非空約束
length=3 字段長度
insertable=false 不包含 INSERT
updatable=false 不包含 UPDATE
列聲明 @Column(name="代表", nullable=false),nullable=false 聲明數據庫非空約束
五、@DynamicInsert 和 @DynamicUpdate 動態字段
動態 SQL 生成,@DynamicInsert 和 @DynamicUpdate,經過啓用動態插入和更新,就能夠告知 hibernate 在須要時生成 SQL 字符串
六、@Immutable 不變實體
讓實體不可變,這樣 hibernate 永遠不會執行 update 語句,同時能夠進行一些優化,好比對不可變類不進行髒檢查。
七、@Basic 非空約束
@Basic(optional=false) 聲明數據庫非空約束
八、@NotNull 非空檢查
@NotNull(message="消息內容"),實體非空註解,可是這個在生成數據庫結構時會被忽略,在實體保存校驗時起做用。
要想在數據庫中生成非空約束,必須結合 @Column(nullable=false) 或者 @Basic(optional=false)
九、@Access 屬性訪問
重寫默認的訪問行爲,字段訪問或者屬性訪問,已經註解過的實體會從強制的 @Id 註解位置繼承訪問行爲,@Id 在字段上則繼承字段訪問,在 getter 方法上則繼承屬性訪問。
@Access(AccessType.FIELD) 字段訪問
@Access(AccessType.PROPERTY) 屬性訪問
當 @Access 在實體級別設置則會影響實體的全部訪問策略,一樣 @Access 也能夠重寫單個屬性的訪問策略
若默認是字段訪問,在字段上添加 @Access(AccessType.PROPERTY) 則被修改成屬性訪問
若默認是屬性訪問,在 getter 方法上添加 @Access(AccessType.FIELD) 則被修改成字段訪問
十、@Formula 派生屬性
運行時經過 @Formula 估算出來,不會出如今 UPDATE 和 INSERT 中,只會出如今 SELECT 中,能夠包含 SQL 函數和子查詢。
例如 數據庫中沒有全名而實體中有 @Formula("concat(firstname,'-',lastname)")
十一、@ColumnTransformer 轉換列值
數據庫中存儲重量 weight 單位是克,實體中使用千克
@Column(name="weight") @org.hibernate.annotations.ColumnTransformer(read="weight / 1000",write="? * 1000") protected int kilogramWeight;
十二、@Generated 默認值
自動刷新數據庫生成的值,如觸發器在每次插入和更新後更新的值。使用 @Generated 註解在每次執行 INSERT 和 UPDATE 後委託給 Hibernate 自動查詢。
好比插入用戶後給一個默認國籍
觸發器
BEGIN set new.nationality = 'CN'; END
java
@Column(insertable=false,updatable=false) @org.hibernate.annotations.ColumnDefault("'CN'") //在 Hibernate 導出 SQL 架構 DDL 時設置列的默認值 @org.hibernate.annotations.Generated(org.hibernate.annotations.GenerationTime.INSERT) protected String nationality;
測試
@Test public void testInsert() { this.session.beginTransaction(); User u = new User(); u.setUsername("admin"); u.setFirstname("Tom"); u.setLastname("Green"); u.setKilogramWeight(62); this.session.persist(u); this.session.getTransaction().commit(); //事務提交後才能獲得最新的值 System.out.println(u.getId() + " Hibernate 自動刷新數據庫觸發器生成的值:" + u.getNationality()); assertTrue( true ); }
1三、@Temporal 時序屬性
JPA 規範要求使用 @Temporal 註解時序屬性,以聲明所映射列的準確 SQL 數據庫類型。當沒有提供時 Hibernate 會默認使用 TemporalType.TIMESTAMP。
Java時序類型 java.util.Date;、java.util.Calendar;、java.sql.Date;、java.sql.Time;、java.sql.Timestamp;
TemporalType 選項 DATE、TIME、TIMESTAMP
1四、@CreationTimestamp和@UpdateTimestamp 建立時間戳和更新時間戳
當沒有提供 @Temporal 時 Hibernate 會默認使用 TemporalType.TIMESTAMP
@Temporal(TemporalType.TIMESTAMP) @Column(updatable=false) @org.hibernate.annotations.CreationTimestamp protected Date createOn; @Temporal(TemporalType.TIMESTAMP) @Column(insertable=false) @org.hibernate.annotations.UpdateTimestamp protected Date updateOn;
當執行插入時 Hibernate 自動給 createOn 賦值,當執行更新時 Hibernate 自動給 updateOn 賦值。
1五、@Enumerated 枚舉類型
默認 Hibernate 會存儲 EnumType.ORDINAL 位置,這種很脆弱。EnumType.STRING 存儲枚舉值的標籤,這樣變動不會影響
@Enumerated(EnumType.STRING) private Sex sex;
1六、@Embeddable 可嵌入組件
@Embeddable public class Address { @NotNull @Column(nullable=false) protected String street; @NotNull @Column(nullable=false) protected String zipcode; @NotNull @Column(nullable=false) protected String city; public Address() {} public Address(String street,String zipcode,String city) { this.street = street; this.zipcode = zipcode; this.city = city; } @Override public String toString() { return "Address [street=" + street + ", zipcode=" + zipcode + ", city=" + city + "]"; } }
嵌入式組件
protected Address address;
重寫嵌入式組件
@AttributeOverrides({ @AttributeOverride(name="street",column=@Column(name="billing_street")), @AttributeOverride(name="zipcode",column=@Column(name="billing_zipcode")), @AttributeOverride(name="city",column=@Column(name="billing_city")) }) protected Address billingAddress;
1七、@Lob
二進制數據和大數據
1八、@Type 類型適配器
@org.hibernate.annotations.Type(type="yes_no") protected boolean verify;
@org.hibernate.annotations.Type(type="true_false") protected boolean verify;
1九、@Convert 轉換器
@Convert(converter = MoneyConverter.class,disableConversion=false) protected Money money;
20、@MappedSuperclass 不持久化超類屬性
使用 @Entity 映射具體類,要想超類的屬性被忽略而且不持久化,則必須使用 @MappedSuperclass
2一、@AttributeOverrides 和 @AttributeOverride 重寫屬性
子類重寫從父類繼承的字段和屬性
類重寫嵌入式字段和屬性
2二、@Inheritance 繼承策略
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 每一個帶有聯合的具體類使用一個表
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 每一個類層次結構使用一個表
@Inheritance(strategy=InheritanceType.JOINED)