1. 程式人生 > >JPA-01基本註解

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

    自定義主鍵生成策略

屬性名

釋義

預設值

name

生成器名稱

字串(對應@GeneratedValue註解的generator屬性值)

strategy

具體生成器的類名

見該表下的程式碼塊

parameters

strategy生成器用到的引數

{}

    主鍵生成策略和各自的具體生成器之間的關係,在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就應該採用這樣的方式),示例如下:

@Lob @Basic(fetch = FetchType.LAZY)
    private Byte[] file;

[email protected]

設定該屬性是一個列舉類,下面的例子中,SexEnum是一個性別的列舉類,這樣的話,我們就可以通過下面的形式將列舉類進行設定為屬性了。

/*
 *這個是將列舉的索引儲存到資料庫
 *就是比如0,1,2這樣的,如果就是想儲存列舉類中的列舉,以字串進行儲存進資料庫,那麼就可以用EnumType.STRING
 */
@Enumerated(EnumType.ORDINAL)
private SexEnum gender;