JPA實體類中經常使用的註解

這兩天在看黎活明老師的JPA的講解視頻,如今只瞭解這麼多,記錄備用。java

import java.util.Date;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.transaction.Transactional;

@Entity(name = "Student") // @Entity:代表本類是一個JPA實體,name的默認值就是類名。
@Table(name = "tbl_student") // @Table:指定和數據庫中映射表的名稱(默認配置好了數據源)。
public class Student {

    private Integer id; // 主鍵,自增

    private String name; // 普通string

    private Date birthday; // 日期類型數據(只保存年月日)

    private Gender gender; // 枚舉類型數據

    private String info; // 大文本

    private byte[] file; // 二進制文件流

    private String imagePath; // 設置這個字段和數據表字段沒有映射關係
    
    /*
     * 此處穿插一個問題,什麼是屬性,什麼是字段?
     * 字段:往上看,上面定義的這些都叫字段。
     * 屬性:往下看,get方法get後面跟的字符串叫作屬性。
     * 
     * 字段和屬性有啥區別?
     * 自動生成get/set方法時:屬性和字段均可以和數據庫表字段映射,此時的屬性和字段名是一致的。
     * 當屬性和字段名不一致時:只有屬性纔會和數據庫表字段產生映射。
     * 
     * 因此:
     * 使用註解映射屬性和數據庫表字段的關係時,最好將註解寫在get方法上。
     * 如果自動生成的get/set方法,即屬性和字段名一致時,註解寫在字段上面也是ok的。
     */

    @Id // @Id:標識主鍵
    @GeneratedValue(strategy = GenerationType.AUTO) // @GeneratedValue:指定自增策略,此處寫的是默認策略,會根據不一樣數據庫使用相應的自增方式。
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    // @Column:用來指定和數據庫表字段的映射,同時可指定數據庫中的字段長度,是否惟一,是否可爲空等一系列的配置。
    @Column(name = "name", length = 30, unique = true, nullable = false)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // @Temporal:指定是日期類型,而且保存格式爲年月日(也能夠指定爲時間或時間戳)。
    @Temporal(TemporalType.DATE)
    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    // @Enumerated:指定是枚舉類型,保存時保存字符串。若不指定EnumType.STRING,只會保存在枚舉中的下標(index)。
    @Enumerated(EnumType.STRING)
    @Column(length = 5)
    public Gender getGender() {
        return gender;
    }

    public void setGender(Gender gender) {
        this.gender = gender;
    }

    // @Lob:大文本。如不指定@Lob,最多隻能保存255個字符。指定@Lob以後能夠保存很是大的文本。
    @Lob
    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    // @Lob:此處@Lob保存的是字符流。
    @Lob
    @Basic(fetch = FetchType.LAZY) // 此處設置查取對象時延遲加載字符流,避免佔用太多的內存。只有用到該屬性時,纔會去加載。
    public byte[] getFile() {
        return file;
    }

    public void setFile(byte[] file) {
        this.file = file;
    }

    // @Transactional:用於指定該屬性和數據庫表沒有映射關係。
    @Transactional
    public String getImagePath() {
        return imagePath;
    }

    public void setImagePath(String imagePath) {
        this.imagePath = imagePath;
    }

}

/*
 * 測試枚舉類型的枚舉類
 */
enum Gender {
    MAN, WOMAN
}
相關文章
相關標籤/搜索