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所對應的類為關係被擁有方,而關聯的另一方為關係擁有方:
關係擁有方:對應擁有外來鍵的資料庫表
關係被擁有方:對應主鍵被子表引用為外來鍵的資料庫表
@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;