日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

休眠中的标识符

發(fā)布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 休眠中的标识符 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)為序列生成策略。

UUID生成僅在Hibernate 5和更高版本中受支持,并且長度為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)該優(yōu)先使用SEQUENCE生成策略,而大多數(shù)現(xiàn)代數(shù)據(jù)庫通常都會這樣做。

復(fù)合標(biāo)識符:

Hibernate還允許我們定義一個復(fù)合標(biāo)識符。 要定義組合標(biāo)識符,我們創(chuàng)建一個主鍵類,其中包含構(gòu)成組合鍵的持久屬性。 根據(jù)JPA規(guī)范, 我們的主鍵類必須為:

  • 用@EmbeddedId或@IdClass注釋進(jìn)行注釋
  • 公開并有一個公開的無參數(shù)構(gòu)造函數(shù)
  • 可序列化
  • 實(shí)現(xiàn)equals()和hashCode()方法
  • 組成合成的屬性可以是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

    總結(jié)

    以上是生活随笔為你收集整理的休眠中的标识符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。