1. 程式人生 > >jpa 實體註解

jpa 實體註解

匯入的包:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

1. @Entity
被Entity標註的實體類將會被JPA管理控制,在程式執行時,JPA會識別並對映到指定的資料庫表
唯一引數name:指定實體類名稱,預設為當前實體類的非限定名稱。
若給了name屬性值即@Entity(name="XXX"),則jpa在倉儲層(資料層)進行自定義查詢時,所查的表名應是XXX。
如:select s from XXX s

2. @Table


當你想生成的資料庫表名與實體類名稱不同時,使用 @Table(name="資料庫表名"),與@Entity標註並列使用,置於實體
類宣告語句之前

@Entity
@Table(name="t_student")
public class student{
  ...


@Table中的引數(不常用)

catalog: 用於設定表所對映到的資料庫的目錄
schema: 用於設定表所對映到的資料庫的模式
uniqueConstraints: 設定約束條件

3. @Id

@Id 用於實體類的一個屬性或者屬性對應的getter方法的標註,被標註的的屬性將對映為資料庫主鍵

[email protected] 
設定識別符號的生成策略,常與@Id一起使用 
引數:strategy指定具體的生成策略 
方式一:@GeneratedValue(strategy=GenerationType.AUTO) 也是預設策略, 即寫成@GeneratedValue也可; 
類似於hibernate的native策略,生成方式取決於底層的資料庫。 
方式二:@GeneratedValue(strategy = GenerationType.IDENTITY)指定“自動增長”策略,適用於MySQL; 
方式三:@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “seq_tbl_person”)指定“序列”策略,常用於Oracle,其中generator表示生成器的名字。而且還要指定@SequenceGenerator(name = “seq_tbl_person”, sequenceName = “seq_tbl_person”, allocationSize = 1)註解配合使用 
其中name指定生成器的名字(與generator的值一樣),sequenceName指定資料庫中定義序列的名字,allocationSize指定序列每次增長1

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private String id ;

 

[email protected]
@Basic表示一個簡單的屬性到資料庫表的欄位的對映,對於沒有任何標註的 getXxxx() 方法,預設即為@Basic(fetch=FetechType.EAGER)
@Basic引數:
  1. fetch 表示該屬性的載入讀取策略
    1.1 EAGER 主動抓取 (預設為EAGER)
    1.2 LAZY 延遲載入,只有用到該屬性時才會去載入
  2. optional (預設為 true)
    表示該屬性是否允許為null

6. @Column
通常置於實體的屬性宣告之前,可與 @Id 標註一起使用
@Column引數:
  1. name: 指定對映到資料庫中的欄位名
  2. unique: 是否唯一,預設為false
  3. nullable: 是否允許為null,預設為true
  5. insertable: 是否允許插入,預設為true
  6. updatetable: 是否允許更新,預設為true
  7. columnDefinition: 指定該屬性對映到資料庫中的實際型別,通常是自動判斷。

@Data
@Entity
@Table(name="table_management_fields")
public class TableManagementFields implements Serializable{
	private static final long serialVersionUID = -201810311200L;
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private String id ;
	
	@Column(name="db_name")
	private String dbName ;//欄位所在庫
	
	@Column(name="table_name")
	private	String tableName;//欄位所在表
.......



7. @Transient
JPA會忽略該屬性,不會對映到資料庫中,即程式執行後資料庫中將不會有該欄位

8. @Temporal
Java中沒有定義 Date 型別的精度,而資料庫中,表示時間型別的資料有 DATE,TIME,TIMESTAMP三種精度
  - @Temporal(TemporalType.DATE) 表示對映到資料庫中的時間型別為 DATE,只有日期
  - @Temporal(TemporalType.TIME) 表示對映到資料庫中的時間型別為 TIME,只有時間
  - @Temporal(TemporalType.TIMESTAMP) 表示對映到資料庫中的時間型別為 TIMESTAMP,日期和時間都有

9. @Embedded 和 @Embeddable
用於一個實體類要在多個不同的實體類中進行使用,而本身又不需要獨立生成一個數據庫表
 

10. @JoinColumn
定義表關聯的外來鍵欄位名
常用引數有:
  1. name: 指定對映到資料庫中的外來鍵的欄位名
  2. unique: 是否唯一,預設為false
  3. nullable: 是否允許為null,預設為true
  4. insertable: 是否允許插入,預設為true
  5. updatetable: 是否允許更新,預設為true
  6. columnDefinition: 指定該屬性對映到資料庫中的實際型別,通常是自動判斷。

11. @OneToOne
引數:

targetEntity: 指定關聯實體型別,預設為被註解的屬性或方法所屬的類
cascade: 級聯操作策略 
CascadeType.ALL 級聯所有操作
CascadeType.PERSIST 級聯新增
CascadeType.MERGE 級聯歸併更新
CascadeType.REMOVE 級聯刪除
CascadeType.REFRESH 級聯重新整理
CascadeType.DETACH 級聯分離
fetch: fetch 表示該屬性的載入讀取策略 (預設值為 EAGER) 
EAGER 主動抓取
LAZY 延遲載入,只有用到該屬性時才會去載入
optional: 預設為true,關聯欄位是否為空 
如果為false,則常與@JoinColumn一起使用
mappedBy: 指定關聯關係,該引數只用於關聯關係被擁有方 
只用於雙向關聯@OneToOne,@OneToMany,@ManyToMany。而@ManyToOne中沒有 
@OneToOne(mappedBy = “xxx”) 
表示xxx所對應的類為關係被擁有方,而關聯的另一方為關係擁有方 
關係擁有方:對應擁有外來鍵的資料庫表
關係被擁有方:對應主鍵被子表引用為外來鍵的資料庫表
orphanRemoval:預設值為false 
判斷是否自動刪除與關係擁有方不存在聯絡的關係被擁有方(關係被擁有方的一個主鍵在關係擁有方中未被引用, 
當jpa執行更新操作時,是否刪除資料庫中此主鍵所對應的一條記錄,若為true則刪除)
 

12. @ManyToOne、@OneToMany
多對一(也可叫一對多,只是前後表顛倒一下而已),只有雙向多對一時才用得到@OneToMany。多對一中多的一方必定是對應資料庫中擁有外來鍵的表,即是關係擁有方,@ManyToOne只用在多對一中代表多的一類中,因為mappedBy只用於關係被擁有方,所以@ManyToOne引數中不包含mappedBy。

@ManyToOne引數:

targetEntity: 指定關聯實體型別,預設為被註解的屬性或方法所屬的類
cascade: 級聯操作策略 
CascadeType.ALL 級聯所有操作
CascadeType.PERSIST 級聯新增
CascadeType.MERGE 級聯歸併更新
CascadeType.REMOVE 級聯刪除
CascadeType.REFRESH 級聯重新整理
CascadeType.DETACH 級聯分離
fetch: fetch 表示該屬性的載入讀取策略(@ManyToOne 的預設值是 EAGER,@OneToMany 的預設值是 LAZY) 
EAGER 主動抓取
LAZY 延遲載入,只有用到該屬性時才會去載入
optional: 預設為true,關聯欄位是否為空 
如果為false,則常與@JoinColumn一起使用
@OneToMany 引數除上述以外還有:

mappedBy: 指定關聯關係,該引數只用於關聯關係被擁有方 
只用於雙向關聯@OneToOne,@OneToMany,@ManyToMany。而@ManyToOne中沒有 
@OneToMany(mappedBy = “xxx”) 
表示xxx所對應的類為關係被擁有方,而關聯的另一方為關係擁有方

關係擁有方:對應擁有外來鍵的資料庫表
關係被擁有方:對應主鍵被子表引用為外來鍵的資料庫表
orphanRemoval:預設值為false 
判斷是否自動刪除與關係擁有方不存在聯絡的關係被擁有方(關係被擁有方的一個主鍵在關係擁有方中未被引用, 
當jpa執行更新操作時,是否刪除資料庫中此主鍵所對應的一條記錄,若為true則刪除)


13. @ManyToMany
targetEntity: 指定關聯實體型別,預設為被註解的屬性或方法所屬的類
cascade: 級聯操作策略 
CascadeType.ALL 級聯所有操作
CascadeType.PERSIST 級聯新增
CascadeType.MERGE 級聯歸併更新
CascadeType.REMOVE 級聯刪除
CascadeType.REFRESH 級聯重新整理
CascadeType.DETACH 級聯分離
fetch: fetch 表示該屬性的載入讀取策略 (預設值為 LAZY) 
EAGER 主動抓取
LAZY 延遲載入,只有用到該屬性時才會去載入 
mappedBy: 指定關聯關係,該引數只用於關聯關係被擁有方 
只用於雙向關聯@OneToOne,@OneToMany,@ManyToMany。而@ManyToOne中沒有。 
@ManyToMany(mappedBy = “xxx”) 
表示xxx所對應的類為關係被擁有方,而關聯的另一方為關係擁有方:
關係擁有方:對應擁有外來鍵的資料庫表
關係被擁有方:對應主鍵被子表引用為外來鍵的資料庫表
 

[email protected]

@OneToMany(mappedBy="export",cascade=CascadeType.ALL)

@OrderBy("ORDER_NO") 按照下面集合中實體對應表中 的ORDER_NO欄位asc排序 升序

private Set<ExportProduct> exportProducts; //報運下的貨物 一對多

 

[email protected] 
可選 
@MappedSuperclass可以將超類的JPA註解傳遞給子類,使子類能夠繼承超類的JPA註解


[email protected] 
@Embedded將幾個欄位組合成一個類,並作為整個Entity的一個屬性. 
例如User包括id,name,city,street,zip屬性. 
我們希望city,street,zip屬性對映為Address物件.這樣,User物件將具有id,name和address這三個屬性. 
Address物件必須定義為@Embededable
 

17. @Enumerated
當實體類中有列舉型別的屬性時,預設情況下自動生成的資料庫表中對應的欄位型別是列舉的索引值,是數字型別的,若希望資料庫中儲存的是列舉對應的String型別,在屬性上加入@Enumerated(EnumType.STRING)註解即可。

@Enumerated(EnumType.STRING)
@Column(nullable = true)
private RoleEnum role;