在Hibernate中使用注解,主要是為了替代映射文件,完成“類到表,屬性到字段”的映射。
JPA提供了一套功能強大的注解。Hibernate直接使用了JPA的這套注解。當然,對於JPA中的一些不足,Hibernate又開發了一些自己的注解。這些注解要么繼承自JPA,要么是獨立的注解,作為JPA的補充。
故,我們使用的注解,基本是javax.persistence.Transient包中的。
使用注解時需注意以下幾點:
(1)使用的均為javax.persistence.Transient包中的注解
(2)不再需要映射文件了
(3)在Hibernate主配置文件中無需指定映射文件了,但需要指定注解的實體類。(springboot這一步也省了)
注解的具體文檔在javax.persistence包下的注解類型總結Annotation Type Summry中。
1、Hibernate基本注解
根據其標注的位置與完成的功能,Hibernate注解可分為兩種:類級注解、屬性級注解。
. 類級注解:注解在類的頭部。完成類到表的映射。
. 屬性級注解:注解在屬性上面,或屬性的get方法上面。完成屬性到字段的映射。
第一類:類級注解
(1)@Entity
用在POJO類上,表示當前類為實體類。name屬性為實體名稱。默認為類的非限定性類名。一般使用默認值。
(2)@Table
與@Entity聯合使用。name屬性指定映射的表名。默認與實體名稱相同。
@Entity @Table(name="city") public class City {}
第二類:屬性級注解
屬性級注解根據其注解屬性的不同,又可分為兩類:主鍵相關注解,與普通屬性注解。
主鍵相關注解
(1)@Id
用在主鍵id屬性上,或其get方法上,表示當前屬性將對應數據庫中的主鍵。
(2)@GeneratedValue
指定主鍵值的來源。其屬性strategy用於指定主鍵的生成策略。其值為系統定義好的四種策略之一。默認為AUTO。
GenerationType.AUTO:根據底層數據庫自動選擇(默認)若數據庫支持自增長,則為自增長。類似於配置文件中的native生成策略。
在MySql中使用該策略,自動選擇了Sequence生成方式。即主鍵值來自於序列表,而序列表由DB自己維護。查看數據庫可看到,其創建了兩個表,一個是映射表t_student,另一個則是序列表hibernate_sequence。
后台報錯,查看錯誤信息,提示需要填充該序列表:you need to populate the table: hibernate_sequence。打開表hibernate_sequence,發現表中為空,即序列為空。需要為序列表指定一個初始值。填值為1后,再運行就不報錯了。
GenerationType.IDENTITY:根據數據庫的Identity字段生成。類似於配置文件中的indentity生成策略。
GenerationType.SEQUENCE:使用Sequence來決定主鍵的取值。類似於配置文件中的Sequence生成策略。
GenerationType.TABLE:使用指定表來決定主鍵取值,結合@TableGenerator使用。
注解中的生成策略只有四種。若要使用Hibernae映射文件中的主鍵生成器,則可使用@GenericGenerator指定一個Hibernate主鍵生成器,再使用@GeneratedValue的屬性generator來引用即可。
@Id @GeneratedValue(generator = "city") @GenericGenerator(name ="city",strategy = "native") @Column(name="CityId") private Integer cityId;
(1)@Column
可將屬性映射到列,描述了數據庫表中該字段的詳細定義。該注解的屬性較多。
name:可選,表示DB中該字段的名稱,默認與屬性名相同
nullable:可選,表示該字段是否允許為 null,默認為 true
unique:可選,表示該字段是否唯一,默認為 false
length:可選,表示該字段的大小,僅對 String 類型的字段有效,默認值255
insertable:可選,表示該字段是否可以出現在insert語句中。默認為 true。通常主鍵、時間戳等字段的該值設置為false。因為它們的值都是自動生成的,不需要在insert時插入。
updateable:可選,表示該字段是否可以出現在update語句中。默認為true。通過對於一經創建就不用修改的字段,如birthday、gender等,可將該值設置為false。
table:可選。當前字段所在的表。默認為當前表。
precision和scale:表示精度,當字段類型為double時,precision表示數值的總長度,scale表示小數點所占的位數。
columnDefinition:可選。用於覆蓋數據庫DDL建表語句中對於該字段的創建語句。
(2)@Basic與@Transient
@Basic:表示該字段將映射到DB中。是屬性的默認注解。
@Transient:表示該字段將不映射到DB中。(無屬性)
(3)@Version
可以在實體bean中使用@Version注解,通過這種方式可添加對樂觀鎖定的支持。(無屬性)
(4)@Temporal
Java代碼中使用的時間日期類型為java.util包下的Time、Date與Timestamp。而注解使用的則為java.sql包下的Time、Date與Timestamp。@Temporal表示將java.util包下的類映射為java.sql包下的相應類。
java.sql包下的Date、Time與Timestamp這三種時間,其精確度是不同。具體如下:
import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; /** * Created by wangbin10 on 2018/4/25. */ @Entity @Table(name="city") public class City { @Id @GeneratedValue(generator = "city") @GenericGenerator(name ="city",strategy = "native") @Column(name="CityId") private Integer cityId; @Column(name="CityName") private String cityName; public Integer getCityId() { return cityId; } public void setCityId(Integer cityId) { this.cityId = cityId; } public String getCityName() { return cityName; } public void setCityName(String cityName) { this.cityName = cityName; } @Override public String toString() { return "City{" + "cityId=" + cityId + ", cityName='" + cityName + '\'' + '}'; } }