詳細介紹javax.persistence下面的Entity中常用的注解。
雖然Spring Data JPA已經幫我們對數據的操作封裝得很好了,約定大於配置思想,幫我們默認了很多東西。JPA(Java持久性API)是存儲業務實體關聯的實體來源。它顯示了如何定義一個面向普通Java對象(POJO)作為一個實體,以及如何與管理關系實體提供一套標准。因此,javax.persistence下面的有些注解還是必須要去了解的,以便於更好地提高工作效率。
1.基本注解
基本注解包括@Entity、@Table、@Id、@IdClass、@GeneratedValue、@Basic、@Transient、@Column、@Temporal、@Enumerated、@Lob
1.1@Entity
@Entity定義對象將會成為被JPA管理的實體,將映射到指定的數據庫表。
1.2@Table
@Table指定數據庫的表名。
1.3@Id
@Id定義屬性為數據庫的主鍵,一個實體里面必須有一個。
1.4@IdClass
@IdClass利用外部類的聯合主鍵。
作為符合主鍵類,要滿足以下幾點要求。
必須實現Serializable接口。
必須有默認的public無參數的構造方法。
必須覆蓋equals和hashCode方法。equals方法用於判斷兩個對象是否相同,EntityManger通過find方法來查找Entity時是根據equals的返回值來判斷的。在本例中,只有對象的name和email值完全相同或同一個對象時才返回true,否則返回false。hashCode方法返回當前對象的哈希碼,生成的hashCode相同的概率越小越好,算法可以進行優化
1.5 @GeneratedValue
@GeneratedValue為主鍵生成策略
GenerationType一共有以下4個值:
1.6 @Basic
@Basic表示屬性是到數據庫表的字段的映射。如果實體的字段上沒有任何注解,默認即為@Basic。
1.7 @Transient
@Transient表示該屬性並非一個到數據庫表的字段的映射,表示非持久化屬性,與@Basic作用相反。JPA映射數據庫的時候忽略它。
1.8 @Column
@Column定義該屬性對應數據庫中的列名
1.9@Temporal
@Temporal用來設置Date類型的屬性映射到對應精度的字段。
(1)@Temporal(TemporalType.DATE)映射為日期∥date(只有日期)
(2)@Temporal(TemporalType.TIME)映射為日期∥time(只有時間)。
(3)@Temporal(TemporalType.TIMESTAMP)映射為日期∥datetime(日期+時間)。
1.10@Enumerated
直接映射enum枚舉類型的字段
1.11@Lob
@Lob 將屬性映射成數據庫支持的大對象類型,支持以下兩種數據庫類型的字段。
(1)Clob(Character Large Ojects)類型是長字符串類型,java.sql.Clob、Character[]、char[]和String將被映射為Clob類型。
(2)Blob(Binary Large Objects)類型是字節類型,java.sql.Blob、Byte[]、byte[]和實現了Serializable接口的類型將被映射為Blob類型。
(3)Clob、Blob占用內存空間較大,一般配合@Basic(fetch=FetchType.LAZY)將其設置為延遲加載。
2.關聯關系注解
關聯關系注解包括@JoinColumn、@OneToOne、@OneToMany、@ManyToOne、@ManyToMany、@JoinTable、@OrderBy。
2.1 @JoinColumn定義外鍵關聯的字段名稱
用法:@JoinColumn主要配合@OneToOne、@ManyToOne、@OneToMany一起使用,單獨使用沒有意義。
@JoinColumns定義多個字段的關聯關系。
2.2 @OneToOne關聯關系
用法:@OneToOne需要配合@JoinColumn一起使用。注意:可以雙向關聯,也可以只配置一方,需要視實際需求而定。