在Hibernate中使用註解,主要是爲了替代映射文件,完成「類到表,屬性到字段」的映射。
JPA提供了一套功能強大的註解。Hibernate直接使用了JPA的這套註解。固然,對於JPA中的一些不足,Hibernate又開發了一些本身的註解。這些註解要麼繼承自JPA,要麼是獨立的註解,做爲JPA的補充。
故,咱們使用的註解,基本是javax.persistence.Transient包中的。
使用註解時需注意如下幾點:
(1)使用的均爲javax.persistence.Transient包中的註解
(2)再也不須要映射文件了
(3)在Hibernate主配置文件中無需指定映射文件了,但須要指定註解的實體類。(springboot這一步也省了)java
註解的具體文檔在javax.persistence包下的註解類型總結Annotation Type Summry中。spring
根據其標註的位置與完成的功能,Hibernate註解可分爲兩種:類級註解、屬性級註解。
. 類級註解:註解在類的頭部。完成類到表的映射。
. 屬性級註解:註解在屬性上面,或屬性的get方法上面。完成屬性到字段的映射。sql
(1)@Entity
用在POJO類上,表示當前類爲實體類。name屬性爲實體名稱。默認爲類的非限定性類名。通常使用默認值。數據庫
(2)@Table
與@Entity聯合使用。name屬性指定映射的表名。默認與實體名稱相同。springboot
@Entity @Table(name="city") public class City {}
屬性級註解根據其註解屬性的不一樣,又可分爲兩類:主鍵相關注解,與普通屬性註解。ide
(1)@Id
用在主鍵id屬性上,或其get方法上,表示當前屬性將對應數據庫中的主鍵。this
(2)@GeneratedValue
指定主鍵值的來源。其屬性strategy用於指定主鍵的生成策略。其值爲系統定義好的四種策略之一。默認爲AUTO。spa
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來引用便可。hibernate
@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建表語句中對於該字段的建立語句。code
(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 + '\'' + '}'; } }