Hibernate注解(一):基本注解


在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 + '\'' +
                '}';
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM