JPA-01基本註解
[email protected]
註解在類名上,代表這個類是實體類。被註釋的類和資料庫中的某個表建立一一對應的關係。
- 代表這個類是實體類,並且使用預設的orm規則(類名即表名,類屬性名即表字段名)
- 如果想改變這種預設的orm規則,就要使用@Table來改變class名與表名的對映規則,@Column來改變class中欄位名與db中表的欄位名的對映規則。
- 僅使用 @javax.persistence.Entity 和 @javax.persistence.Id 這兩個註解,就可以作為一個實體類與資料庫中的表相對應。
[email protected]
@Table(name="資料庫表名")
註解在類名上,代表將這個類和資料庫中的某個表的名字之間建立一一對應的關係。
- 當實體類與其對映的資料庫表名不同名時需要使用 @Table 標註說明,該標註與 @Entity 標註並列使用。
- 註解屬性說明:
屬性名 |
釋義 |
值 |
預設值 |
name |
指定資料庫表名稱 若不指定則以實體類名稱作為表名 |
字串 |
“” |
schema |
指定該實體對映的schema |
字串 |
“” |
catalog |
與schema屬性相同 |
字串 |
“” |
indexes |
索引 |
@Index |
{} |
uniqueConstraints |
唯一約束 |
@UniqueConstraint |
{} |
[email protected]
註解在某一屬性的get方法上,代表(標記)這個欄位是主鍵。
- 可以標記為主鍵的資料型別:double和float浮點型別和它們對應的封裝類不能作為主鍵(這是因為判斷是否唯一是通過equals方法來判斷的,不能夠準確的匹配)
分類 |
型別 |
Java基本資料型別 |
byte、int、short、long、char |
Java基本資料型別對應的封裝類 |
Byte、Integer、Short、Long、Character |
大數值型類 |
java.math.BigInteger |
字串型別 |
String |
時間日期型 |
java.util.Date、java.sql.Date |
- 聯合主鍵:標記屬性的主鍵(一個實體中可以出現多個@Id註解,但需要@IdClass配合使用,以表示聯合主鍵)。標記多個主鍵以後,需要在類上加@IdClass註解。
@Entity @IdClass(ProjectId.class)
public class Project {
@Id int departmentId;
@Id long projectId;
}
4. 主鍵的自增長方式指定、宣告主鍵的自增長方式(策略)
- mysql
@GeneratedValue(strategy=GenerationType.IDENTITY) 註解在主鍵欄位的get方法上
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int getId() {
return id;
}
因為mysql資料庫在底層就支援主鍵的自增長。
- oracle
@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB") 註解在類名上
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ") 註解在主鍵欄位的get方法上
/*
* 屬性註解
* strategy 策略
* SEQUENCE 序列(oracle支援序列,可以利用序列進行主鍵的自增)
* generator 發生器
* sql_name 自定義序列名,指向@SequenceGenerator的name屬性
* 通過generator制定增長策略通過哪一個序列進行增長
*/
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="sql_name")
public int getId() {
return id;
}
/*
* 類名註解
* name 索引名
* sequenceName 需要對哪一個欄位進行自增長
* allocationSize 分配,配置(步長),每一次增長的幅度
*/
@SequenceGenerator(name="sql_name",sequenceName="sql_name",allocationSize=1)
@Table(name="t_user")
@Entity
public class User {
//other
}
- 通用——讓系統自己去判斷,資料庫底層支援什麼策略,就用哪種方法
@GeneratedValue(strategy=GenerationType.AUTO) 註釋在主鍵屬性的get方法上,
AUTO自動判斷
- 自定義自增策略
——自己定義你的增長策略,我自己有對應的類來支援我的自增長。
@GenericGenerator
/*
* @GenericGenerator 通用的生成器 進行定義,name是索引,strategy是採用的策略
* @GeneratedValue 用於指向哪一個生成器,通過那麼索引
*/
@Id
@GeneratedValue(generator="hibernate-uuid2")
@GenericGenerator(name="hibernate-uuid2",strategy="uuid2")
public String getId() {
return id;
}
3.3 @GenericGenerator 自定義主鍵生成策略
主鍵生成策略和各自的具體生成器之間的關係,在org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory中指定如下: |
public DefaultIdentifierGeneratorFactory() {
this.register("uuid2", UUIDGenerator.class);
this.register("guid", GUIDGenerator.class);
this.register("uuid", UUIDHexGenerator.class);
this.register("uuid.hex", UUIDHexGenerator.class);
this.register("assigned", Assigned.class);
this.register("identity", IdentityGenerator.class);
this.register("select", SelectGenerator.class);
this.register("sequence", SequenceStyleGenerator.class);
this.register("seqhilo", SequenceHiLoGenerator.class);
this.register("increment", IncrementGenerator.class);
this.register("foreign", ForeignGenerator.class);
this.register("sequence-identity", SequenceIdentityGenerator.class);
this.register("enhanced-sequence", SequenceStyleGenerator.class);
this.register("enhanced-table", TableGenerator.class);
}
- 參考
屬性名 |
釋義 |
值 |
預設值 |
strategy |
主鍵的生成策略 |
GenerationType.TABLE 通過表產生主鍵,框架藉由表模擬序列產生主鍵 GenerationType.SEQUENCE 通過序列產生主鍵(不支援MySql) GenerationType.IDENTITY 自增長(不支援Oracle) GenerationType.AUTO 自動選擇合適的策略 |
GenerationType.AUTO |
generator |
自定義生成策略 |
字串(對應@GenericGenerator註解的name屬性值) |
“” |
@GeneratedValue———-表示設定該主鍵的自增方式,其中主要有四種:AUTO(根據資料庫來自動分配),IDENTITY(mysql支援),SEQUENCE(oracle支援),TABLE(這個用得很少),另外,這個註解一般與@Id一起使用 注意:在hibernate中,如果想使用自動建立表,那麼就需要指定主鍵的生成策略,如果不指定,就會出現,操作方法成功,但是卻無法達到期望效果,比如,執行save方法,save執行成功,但是資料庫卻沒有資料插入,就是因為主鍵生成策略出現問題;如果想使用已經建立表的主鍵策略,那麼就用AUTO即可。。。(這是一個非常大的坑) --------------------- 本文來自 wangchaowei_008 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/wangchaowei_008/article/details/80906551?utm_source=copy |
[email protected]
@Column(name="對應表的欄位名")
註解在某一屬性的get方法上,宣告屬性和資料表中欄位的一一對應的關係。
[email protected]
@Temporal(TemporalType.TIMESTAMP)
private Date createTime;//註解可以註釋在屬性欄位上也可以註解在get方法上
指明該屬性獲取時間精度。
預設為TemporalType.TIMESTAMP型別。
TemporalType列舉型別定義如下:
public enum TemporalType {
DATE, //java.sql.Date
TIME, //java.sql.Time
TIMESTAMP //java.sql.Timestamp
}
java.sql.Date、java.sql.Time和java.sql.Timestamp這三種類型不同,它們表示時間的精確度不同。三者的區別如表所示。
型別 |
說明 |
java.sql.Date |
日期型,精確到年月日,例如“2008-08-08” |
java.sql.Time |
時間型,精確到時分秒,例如“20:00:00” |
java.sql.Timestamp |
時間戳,精確到納秒,例如“2008-08-08 20:00:00.000000001” |
[email protected]
一旦變數被transient修飾,變數將不再是物件持久化的一部分,該變數內容在序列化後無法獲得訪問(即:不與表字段對映)。
常用於某屬性僅為臨時變數時。
8. @Basic
@Basic(fetch = FetchType.LAZY)
@Column(name = "CONTENT")
private String content;
表示一個簡單的屬性到資料庫表的欄位的對映,對於沒有任何標註的屬性,預設即為 @Basic。
屬性名 |
釋義 |
值 |
預設值 |
fetch |
載入方式 |
FetchType.EAGER 即時載入 FetchType.LAZY 延遲載入 |
FetchType.EAGER |
strategy |
是否可為null |
布林值 |
true |
屬性optional表示屬性是否可為null,不能用於Java基本資料型別byte、int、short、long、boolean、char、float、double的使用。
hibernate的xml配置的預設載入方式是:懶載入;而jpa註解的預設載入方式是:立即載入。所以有時會為了提高程式的執行效率,我們會採取一些一些方法,改變載入方式就是一種。
對於一些特殊的屬性,比如長文字型text、位元組流型blob型的資料,在載入Entity時,這些屬性對應的資料量比較大,有時建立實體時如果也載入的話,可能嚴重造成資源的佔用。要想解決這些問題,此時就需要設定實體屬性的載入方式為延遲載入(LAZY)。
[email protected]
設定該屬性是大資料型別,比如一個文章存入到資料庫,就可以把該屬性用這個註解進行標識
另外:
@[email protected]——–設定該屬性為懶載入,主要就是對於一些很大的資料量的欄位內容來進行的優化,比如有一個欄位該儲存為5M,那其實載入這個會很花記憶體的,所以通過這注解就可以實現懶載入機制(一般如果某欄位超過1M就應該採用這樣的方式),示例如下:
|
[email protected]
設定該屬性是一個列舉類,下面的例子中,SexEnum是一個性別的列舉類,這樣的話,我們就可以通過下面的形式將列舉類進行設定為屬性了。
/*
*這個是將列舉的索引儲存到資料庫
*就是比如0,1,2這樣的,如果就是想儲存列舉類中的列舉,以字串進行儲存進資料庫,那麼就可以用EnumType.STRING
*/
@Enumerated(EnumType.ORDINAL)
private SexEnum gender;