Hibernate註解(一):基本註解

在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基本註解

根據其標註的位置與完成的功能,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 + '\'' +
                '}';
    }
}
相關文章
相關標籤/搜索