1. 程式人生 > >SpringDataJpa基礎篇1:實體類常用註解

SpringDataJpa基礎篇1:實體類常用註解

SpringDataJpa下的實體類使用註解都是javax.persistence包下的註解。

1、實體類中常用註解

【1、@Entity和@Table(name="")註解】

       @Entity和@Table(name="")註解:表明這是一個實體類。一般用於jpa這兩個註解一般一塊使用,但是如果表名和實體類名相同的話,@Table註解可以省略。

【2、@Id註解】

@Id表示該屬性為主鍵;

【3、自定義主鍵生成策略@GeneratedValue】

     @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "repair_seq"):表示主鍵生成策略是sequence(可以為Auto、IDENTITY、native等,Auto表示可在多個數據庫間切換),指定sequence的名字是repair_seq。

自定義主鍵生成策略需要使用@GeneratedValue註解和@GenericGenerator註解。 

【4、@Column註解】

@Column表示列的說明,如果欄位名與列名相同,則可以省略。@Column註解屬性詳細說明

(1)name屬性:被標註欄位在資料庫表中所對應欄位的名稱;
(2)length屬性:表示該欄位的長度,當欄位的型別為varchar時,該屬性才有效果,預設為255個字元;
(3)nullable屬性:表示該欄位是否可以為null值,預設是true。
(4)unique屬性:表示該欄位是否為唯一標識,預設fasle。
(5)precision和scale屬性:precision屬性和scale屬性表示精度,當欄位型別為double時,precision表示數值的總長度,scale表示小數點所佔的位數。

【5、@Transient註解註解】

      @Transient表示該屬性並非一個到資料庫表的欄位的對映,ORM框架將忽略該屬性.如果一個屬性並非資料庫表的欄位對映,就務必將其標示為@Transient,否則,ORM框架預設其註解為@Basic。

【6、@Temporal註解】

@Temporal註解表示格式化時間日期。有三種,預設是@Temporal(TemporalType.TIMESTAMP)。具體如下:
(1)@Temporal(TemporalType.DATE):日期,頁面取得結果格式如:2016-08-05
(2)@Temporal(TemporalType.TIME):時間,頁面取得結果是: 13:46:25
(3)@Temporal(TemporalType.TIMESTAMP):時間和日期,頁面取得結果是:2016-08-05 13:46:25
     @JsonView註解用來過濾序列化物件的欄位屬性,簡單來說就是定義一個標籤,根據controller的JsonView屬性,將實體類中不同標籤的屬性進行分類顯示。

【7、@OneToOne一對一註解】

@OneToOne註解說明:
(1)targetEntity屬性表示預設關聯的實體型別,預設為當前標註的實體類;
(2)cascade屬性表示與此實體一對一關聯的實體的聯級樣式型別。聯級樣式上當對實體進行操作時的策略。說明:在定義關係時經常會涉及是否定義Cascade(級聯處理)屬性,擔心造成負面影響. 不定義,則對關係表不會產生任何影響
   ①CascadeType.PERSIST (級聯新建)
   ②CascadeType.REMOVE (級聯刪除)
   ③CascadeType.REFRESH (級聯重新整理)
   ④CascadeType.MERGE (級聯更新)中選擇一個或多個。
   ⑤還有一個選擇是使用CascadeType.ALL ,表示選擇全部四項
(3)fetch屬性是該實體的載入方式,有兩種:LAZY和EAGER。
(4)optional屬性表示關聯的實體是否能夠存在null值。預設為true,表示可以存在null值。如果為false,則要同時配合使用@JoinColumn標記。
(5)mappedBy屬性用於雙向關聯實體時,標註在不儲存關係的實體中。

【8、@OneToMany一對多註解】

例如一個公司對應多個部門,可以通過公司獲取到其下面的多個部門資訊。即公司表與部門表之間是一對多的關係;@OneToMany註解說明
(1)targetEntity屬性表示預設關聯的實體型別,預設為當前標註的實體類;因為一對多的實體集合時儲存在集合類中,因此必須指明集合類中儲存的具體型別。
(2)mappedBy屬性用於雙向關聯實體時使用。

【9、@JoinColumn註解】

@JoinColumn(name=”loginId”):在一對一關係時:本表中指向另一個表的外來鍵。一對多關係時:另一個表指向本表的外來鍵。該註解屬性詳細說明:

(1)name屬性是用來標記表中對應的欄位的名稱。如果不設定name的值,預設情況下,name的取值規則如下:
    name=關聯的表的名稱 + "_" + 關聯表主鍵的欄位名
(2)預設情況下,關聯的實體的主鍵一般用來做外來鍵的。如果不想用主鍵作為外來鍵,則需要設定referencedColumnName屬性,如@JoinColumn(name="address_id", referencedColumnName="ref_id")
【注意】@JoinColumn可以與@OneToOne、@ManyToOne或@ManyToMany標記同時使用。
1)一對一和多對一的@JoinColumn註解的都是在“主控方”,都是本表指向外表的外來鍵名稱。
2)一對多的@JoinColumn註解在“被控方”,即一的一方,指的是外表中指向本表的外來鍵名稱。
3)多對多中,joinColumns寫的都是本表在中間表的外來鍵名稱,inverseJoinColumns寫的是另一個表在中間表的外來鍵名稱。

【10、@JoinTable中間表註解】

@JoinTable註解屬性說明:
(1)name屬性為連線兩個表的表名稱。若不指定,則使用預設的表名稱,格式如下:    "表名1" + "_" + "表名2"
(2)joinColumn屬性表示,在儲存關係的表中,所儲存關聯關係的外來鍵的欄位,並配合@JoinColumn標記使用;
(3)inverseJoinColumn屬性與joinColumn類似,它儲存的是儲存關係的另外一個外來鍵欄位;
(4)catalog和schema屬性表示實體指定點目錄名稱或資料庫名稱;
(5)uniqueConstraints屬性表示該實體所關聯的唯一約束條件,一個實體可以有多個唯一約束條件,預設沒有約束;
【注意】:@JoinTable不僅能夠定義一對多的關聯,也可以定義多對多表的關聯。

#角色表Role與資源表Resource之間是多對多的關係,之間的中間表是sys_role_resource。
------------------------------------------------------------------------------------
@ManyToMany(targetEntity=Resource.class)
@JoinTable(name="sys_role_resource",[email protected](name="role_id"),[email protected](name="resource_id"))
private Set<Resource> resources=new HashSet<Resource>(0);
------------------------------------------------------------------------------------------
#@JoinTable 描述了多對多關係的資料表關係。name 屬性指定中間表名稱,joinColumns 定義中間表與Resource資源表的外來鍵關係。上面的程式碼中,中間表sys_role_resource的role_id 列是Role角色表的主鍵列對應的中間表外來鍵列,inverseJoinColumns 屬性定義了中間表與另外一端(Resource)的外來鍵關係。

【@IdClass註解】

@IdClass註解就是複合主鍵時候使用,複合主鍵由多個主鍵欄位組成。

@Entity @IdClass(ProjectId.class)
public class Project {
    @Id int departmentId;
    @Id long projectId;
}
//這裡主鍵是由departmentId和projectId欄位共同組成的主鍵

2、應用

2.1、多對多個關係應用

我們這裡的就用角色表與選單表來進行說明,

#角色表
@Entity
@Table(name="t_roles")
public class Roles {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="roleid")
	private Integer roleid;
	
	@Column(name="rolename")
	private String rolename;
	@ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.EAGER)
	//@JoinTable:對映中間表
	//joinColumns:當前表中的主鍵所關聯的中間表中的外來鍵欄位
	@JoinTable(name="t_roles_menus",[email protected](name="role_id"),[email protected](name="menu_id"))
	private Set<Menus> menus = new HashSet<>();
...................get和set方法省略......................
}
#選單表
@Entity
@Table(name="t_menus")
public class Menus {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="menusid")
	private Integer menusid;	
	@Column(name="menusname")
	private String menusname;	
	@Column(name="menusurl")
	private String menusurl;	
	@Column(name="fatherid")
	private Integer fatherid;
	
	@ManyToMany(mappedBy="menus")
	private Set<Roles> roles = new HashSet<>();
}