hibernate 标识符_Hibernate中的标识符
hibernate 標(biāo)識符
Hibernate中的標(biāo)識符為實(shí)體的主鍵屬性建模。 它有助于我們唯一地標(biāo)識JPA實(shí)體。 每個實(shí)體都必須定義一個標(biāo)識符。 同樣,它可以是簡單的也可以是復(fù)合的。
我們可以通過幾種方式定義一個Hibernate標(biāo)識符。 在本教程中,我們將學(xué)習(xí)如何做。
簡單(單值)標(biāo)識符:
如果我們有一個可以唯一標(biāo)識我們實(shí)體的屬性,則可以使用@Id注釋對該屬性進(jìn)行簡單注釋:
Java
@Entity public class Employee {@Idprivate Integer empId;... }請記住,用@Id注釋的屬性應(yīng)為以下類型之一:
- 任何Java基本類型或任何原始包裝器類型
- 串
- 任何Java 日期類型,或者
- BigDecimal或BigInteger
簡單生成的標(biāo)識符:
如果我們希望自動生成ID值怎么辦? 為此,我們可以更進(jìn)一步,在標(biāo)識符字段上使用@GeneratedValue批注:
Java
@Entity public class Employee {@Id@GeneratedValuepublic Integer empId;... }當(dāng)使用@GeneratedValue時 ,Hibernate在保留實(shí)體的同時會為我們的id列生成值。 對我們而言,重要的是要記住, 我們只能自動生成整數(shù)類型( int,short或long )或UUID 。
此外,我們提供了四種不同的密鑰生成策略,可自動生成標(biāo)識符的值:
Hibernate使用AUTO密鑰生成策略作為默認(rèn)策略。 從一個JPA持久性提供者到另一個JPA持久性提供者, AUTO策略的行為略有不同。 對于 Hibernate,如果 identifier屬性的類型為UUID,則它使用UUIDGenerator或默認(rèn)為序列生成策略。
僅在Hibernate 5和更高版本中支持UUID生成,并且長度為36個字符:
Java
@Entity public class Employee {@Id@GeneratedValueprivate UUID empId;... }生成的UUID的格式為“ 4ee5a777-7981-4e01-06ab-19aabb2eaa122”。
對于IDENTITY生成策略,Hibernate使用IdentityGenerator生成標(biāo)識符值。 這些值由數(shù)據(jù)庫的標(biāo)識列生成,并自動遞增:
Java
@Entity public class Employee {@Id@GeneratedValue (strategy = GenerationType.IDENTITY)private Integer empId;... }使用此策略的主要缺點(diǎn)是它不支持批量JDBC插入。
在這里,顧名思義,數(shù)據(jù)庫序列用于生成我們的標(biāo)識符的值。 Hibernate在內(nèi)部使用SequenceStyleGenerator類來實(shí)現(xiàn)它。 如果我們的數(shù)據(jù)庫不支持序列,它將自動切換到TABLE密鑰生成策略。
SEQUENCE生成器為每個序列生成唯一的值。 我們可以指定我們希望使用的數(shù)據(jù)庫順序:
Java
@Entity public class Employee {@Id@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "emp_generator")@SequenceGenerator(name = "emp_generator",sequenceName = "emp_seq", allocationSize = 100)public Integer empId;... }否則,Hibernate將使用隱式命名的序列hibernate_sequence :
Java
@Entity public class Employee {@Id@GeneratedValue(strategy = GenerationType.SEQUENCE)public Integer empId;... }為我們的標(biāo)識符字段生成值。
Hibernate TableGenerator使用一個表,該表能夠保存標(biāo)識符生成值的多個段。 除非指定,否則Hibernate默認(rèn)使用hibernate_sequences表:
Java
@Entity public class Employee {@Id@GeneratedValue(strategy = GenerationType.TABLE)public Integer empId;... }我們可以使用@TableGenerator來指定用于生成值的數(shù)據(jù)庫表:
Java
@Entitypublic class Employee {@Id@GeneratedValue(strategy = GenerationType.TABLE, generator = "emp_generator") @TableGenerator(name = "emp_generator",table = "emp_generator_tbl",schema = "employees")public Integer empId;...}TABLE策略的伸縮性不是很好,而且性能很差,因此在實(shí)際的實(shí)現(xiàn)中很少使用。 對于所有支持序列的數(shù)據(jù)庫,我們應(yīng)該始終偏向于使用SEQUENCE生成策略,而大多數(shù)現(xiàn)代數(shù)據(jù)庫通常都會這樣做。
復(fù)合標(biāo)識符:
Hibernate還允許我們定義一個復(fù)合標(biāo)識符。 要定義組合標(biāo)識符,我們創(chuàng)建一個主鍵類,其中包含構(gòu)成組合鍵的持久屬性。 根據(jù)JPA規(guī)范, 我們的主鍵類必須為:
組成合成的屬性可以是basic,composite或ManyToOne。 但是,集合和OneToOne屬性被認(rèn)為不合適。
1.使用
定義和使用復(fù)合鍵的一種方法是使用@EmbeddedId批注。
因此,讓我們開始定義主鍵類并使用@Embeddable對其進(jìn)行注釋 :
Java
@Embeddable public class EmployeePurchasesPK implements Serializable {private long empId;private long productId;//equals() and hashCode() methods... }現(xiàn)在,我們可以使用@EmbeddedId批注輕松地從我們的實(shí)體中引用此類:
Java
@Entity public class EmployeePurchases {@EmbeddedIdprivate EmployeePurchasesPK primaryAttributes;... }要使用我們的實(shí)體類設(shè)置或檢索主鍵屬性,我們將具有以下內(nèi)容:
Java
EmployeePurchasesPK primaryAttributes = new EmployeePurchasesPK(); primaryAttributes.setEmpId(1001); primaryAttributes.setProductId(7822);EmployeePurchases empPurchases = new EmployeePurchases(); empPurchases.setPrimaryAttributes(primaryAttributes); ...顯然,我們的EmployeePurchases實(shí)體具有一個由empId和productId組成的復(fù)合鍵。
2.使用
使用@IdClass創(chuàng)建復(fù)合鍵時,可以使用@Id批注在主類中定義所有合成屬性。 我們的主鍵類中的代碼保持原樣,但僅充當(dāng)“影子” :
Java
@Entity @IdClass(EmployeePurchasesPK.class) public class EmployeePurchases {@Idprivate long empId;@Idprivate long productId;...}通過這種方法,我們可以使用主要實(shí)體類的getter / setter方法直接設(shè)置鍵值:
Java
EmployeePurchases empPurchases = new EmployeePurchases(); empPurchases.setEmpId(1011); empPurchases.setProductId(9331); ...但是,此方法無法為我們提供標(biāo)識符和實(shí)體對象之間的清晰區(qū)分。
派生標(biāo)識符:
在Hibernate中,我們可以選擇使用@MapsId注釋從其關(guān)聯(lián)之一復(fù)制實(shí)體的標(biāo)識符值 :
Java
public class EmployeeHistory {@Idprivate long id;@OneToOne@MapsIdprivate Employee employee;...}在這里,我們的EmployeeHistory實(shí)例將具有與相應(yīng)Employee實(shí)例完全相同的ID 。
結(jié)論:
在本教程中,我們研究了在Hibernate中定義標(biāo)識符的多種方法。 我們還介紹了不同的關(guān)鍵自動生成策略。
成為第一個發(fā)表評論的人。
翻譯自: https://www.javacodegeeks.com/2019/04/identifiers-hibernate.html
hibernate 標(biāo)識符
總結(jié)
以上是生活随笔為你收集整理的hibernate 标识符_Hibernate中的标识符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 备案白牌电动车什么意思(备案白牌)
- 下一篇: foxmail怎么添加qq邮箱()