spirng data JPA教程(二)基本註解的使用
上篇文章講解了spring boot JPA的基本的增刪改查操作,這次我們主要講下實體類中基本註解的使用方法
spring boot JAP 中定義實體類時,用到的基本註解包括:
@Entity、@Table、@Id、@IdClass、@GeneratedValue、@Basic、@Transient、@Column、@Temporal、@Enumerated、@Lob
下面首先依次解釋下每個註解的意思
再通過實例,練習下各個註解的使用
項目地址
1.基本註解
@Entity
應用於實體類,表明該實體類被JPA管理,將映射到指定的數據庫表
@Table
應用於實體類,通過name
屬性指定對應該實體類對應數據庫中的表名
@Id
被@Id標記的屬性對應數據庫表的主鍵,一個實體類裏面必須有一個.
@GerneratedValue
於@Id一同使用,定義主鍵的生成策略,通過strategy
屬性指定。
JPA提供的生成策略一共有4個值:
- AUTO — JPA自動選擇合適的策略,是默認選項
- IDENTITY — 採用數據庫ID自增長的方式生成主鍵值,一般用於MySQL數據庫,Oracle不支持這種方式;
- SEQUENCE — 通過序列產生主鍵,通過@SequenceGenerator註解指定序列名,MySql不支持這種方式;
- TABLE — 通過表產生主鍵,會生成一張表模擬序列產生主鍵,該策略通用性強易於數據庫的移植,但是效率低
@Basic
應用於實體類屬性,表明該字段是要映射到數據庫表,@Entity標註的實體類,所有屬性默認爲@Basic,@Baisc有兩個屬性:
fetch
:屬性的讀取策略,有EAGER
和LAZY
兩種取值,分別表示主動抓取和延遲抓取,默認爲EAGER
optional
:表示該屬性是否可以爲null
,默認值爲true
。
@Basic(fetch =FetchType.LAZY)標註某屬性時,表示只有調用Hibernate對象的該屬性的get方法時,纔會從數據庫表中查找對應該屬性的字段值
@Column
應用於實體類屬性,可以指定數據庫表字段的名字和其他屬性。其屬性包括:
-
name
:表示數據庫表中該字段的名稱,默認情形屬性名稱一致。 -
nullable
:表示該字段是否允許爲null
,默認爲true
。 -
unique
:表示該字段是否是唯一標識,默認爲false
。 -
length
:表示該字段的大小,僅對String
類型的字段有效。 -
insertable
:表示在ORM框架執行插入操作時,該字段是否應出現INSETRT語句中,默認爲true
。 -
updateable
:表示在ORM框架執行更新操作時,該字段是否應該出現在UPDATE語句中,默認爲true
。對於一經創建就不能更改的字段,該屬性非常有用,比如email
屬性。 -
columnDefinition
:表示該字段在數據庫中的實際類型。通常ORM框架可以根據屬性類型自動判斷數據庫中字段的類型,但是依然有些例外:
Date
類型無法確定數據庫中字段類型究竟是DATE
、TIME
還是TIMESTAMP
String
的默認映射類型爲VARCHAR
,如果希望將String
類型映射到特定數據庫的BLOB
或TEXT
字段類型,則需要進行設置
@Transient
作用在類屬性上,與@Basic作用相反,表明該屬性不需要持久化,JPA映射數據時忽略該屬性;
@Temporal
作用在類屬性上,用來設置Date類型的屬性映射到數據庫時的精度,
@Temporal(TemporalType.DATE)
映射爲日期 // date (只有日期)@Temporal(TemporalType.TIME)
映射爲日期 // time (是有時間)@Temporal(TemporalType.TIMESTAMP)
映射爲日期 // date time (日期+時間)
@Lob
應用到實體類屬性上,表示將屬性映射成數據庫支持的大對象類型,Clob或者Blog。其中:
- Clob(Character Large Ojects)類型是長字符串類型,
java.sql.Clob
、Character[]
、char[]
和String
將被映射爲 Clob 類型。 - Blob(Binary Large Objects)類型是字節類型,
java.sql.Blob
、Byte[]
、byte[]
和 實現了Serializable
接口的類型將被映射爲 Blob 類型。
因爲這兩種類型的數據一般佔用的內存空間比較大,所以通常使用延遲加載的方式,與@Basic
標註同時使用,設置加載方式爲FetchType.LAZY
。
2.基本註解的使用
好了,開始擼代碼
新建一個Blog類
@Entity
@Table(name = "t_blog")
public class Blog {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Basic
private String title;
@Temporal(TemporalType.TIMESTAMP)
private Date createtime;
@Transient
private String author;
@Column(name = "blog_content", nullable = false)
@Lob
@Basic(fetch = FetchType.LAZY)
private String content;
}
@Entity 告訴JPA該實體類Blog需要映射到數據庫
@Tabel 指定Blog類映射時,數據庫對應的表名爲t_blog
@Id @GeneratedValue 指定t_blog表的主鍵爲id,採用自增長的方式生成主鍵
@Basic 爲默認屬性,可以不指定
@Temporal 指定日期字段createtime的映射格式爲:日期+時間
@Transient 指定author字段不映射到數據庫表
@Column 指定字段content映射t_blog表時的列名爲blog_content,nullable = false 值不能爲null
@Lob 標明該字段爲大對象,並給該字段配置了懶加載
執行程序, 日誌顯示建表成功
打開navicate 刷新 ~~