基本注解
1、@Entity :用於添加在實體類上,定義該JAVA類成為被JPA管理的實體,將映射到指定的數據庫表。如定義一個實體類Category,它將映射到數據庫中的category表中。
2、@Id :定義屬性為數據庫表中的主鍵列,一個實體里面必須有一個。
3、@Table:指定數據庫的表名,與@Entity一同使用。
屬性name:表的名字,如果不寫,系統認為和實體類一致。
屬性catalog,schema用於設置目錄和此表所在schema,一般不需要填寫;
屬性uniqueConstraints,唯一性約束,只有創建表的時候有用,默認不需要;
屬性indexes,索引,只有創建表的時候有用,默認不需要。
4、@Basic:表示屬性是到數據庫表字段的映射。如果實體的字段上沒有任何注解,默認即為@Basic;
屬性fetch,抓取方式,默認FetchType.EAGER(立即加載),FetchType.LAZY(延遲加載,主要應用在大字段上面);
屬性optional,設置這個字段是否可以為null,默認是true。
5、@Transient:非持久化屬性,表示該屬性並非是一個到數據庫表的字段的映射,與@Basic作用相反。JPA映射數據庫的時候忽略它。
6、@Column:定義該屬性對應數據庫中的列名。
屬性name,數據庫中的列名。如果不寫默認和實體屬性名一致;
屬性unique,是否唯一。默認false;
屬性nullable,是否允許為空。默認為true;
屬性insertable,執行insert操作的時候是否包含此字段,默認為true;
屬性updatable,執行updatable操作的時候是否包含此字段,默認為true;
屬性columnDefinition,表示該字段在數據庫中的實際類型。
屬性length,數據庫字段的長度,默認255;
屬性table,precision,scale,我沒用到過,一般不設置。
7、@GeneratedValue:主鍵生成策略。
屬性strategy,id的生成策略,GenerationType.TABLE,通過表產生主鍵,框架由表模擬序列產生主鍵,使用該策略可以使應用更易於數據庫移植;GenerationType.SEQUENCE,通過序列產生主鍵,通過@SequenceGenerator注解指定序列名,MySql不支持這種方式;GenerationType.IDENTITY,數據庫id自增長,多用於MySql;GenerationType.AUTO,JPA自動選擇合適的策略,默認選項。
屬性generator:通過Sequence生成id,常見Orcale數據庫id生成,需要配合@SequenceGenerator使用。
8、@Temporal:用來設置Date類型的屬性映射到對應精度的字段。TemporalType.DATE,映射為數據庫date,TemporalType.TIME映射為數據庫time,TemporalType.TIMESTAMP,映射為datetime。(jdk8的話,可以使用新的時間類來替代Date)
9、@Enumerated:映射枚舉字段。屬性value,默認是EnumType.ORDINAL(枚舉字段的下標),EnumType.STRING枚舉字段的Name;應用如下
10、@Lob,將屬性字段映射成數據庫支持的大對象類型,支持一下兩種數據庫類型的字段。
Clob(Character Large Objects)類型是長字符串類型,java.sql.Clob、Character[]、char[]和String將被映射成Clob類型。
Blob(Binary Large Objects)類型是字節類型,java.sql.Blob、Byte[]、byte[]和實現了Serializable接口的類型將被映射為Blob類型。
由於Clob、Blob占用內存空間較大,一般配合@Basic(fetch=FetchType.LAZY)將其設置為延遲加載。
11、@IdClass:利用外部類的聯合主鍵。
外部類要符合一下幾點:必須實現java.io.Serializable接口;必須有默認的無參構造函數;必須覆蓋equals和hashCode方法。
實體類要,在類上添加@IdClass並指定外部主鍵類,每個主鍵上都要添加@Id注解。
Repository接口要把主鍵改為外部主鍵類。
使用如下
源碼地址:https://github.com/caofanqi/study-spring-data-jpa