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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hibernate 标识符_Hibernate中的标识符

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

hibernate 標識符

Hibernate中的標識符為實體的主鍵屬性建模。 它有助于我們唯一地標識JPA實體。 每個實體都必須定義一個標識符。 同樣,它可以是簡單的也可以是復合的。

我們可以通過幾種方式定義一個Hibernate標識符。 在本教程中,我們將學習如何做。

簡單(單值)標識符:

如果我們有一個可以唯一標識我們實體的屬性,則可以使用@Id注釋對該屬性進行簡單注釋:

Java

@Entity public class Employee {@Idprivate Integer empId;... }

請記住,用@Id注釋的屬性應為以下類型之一:

  • 任何Java基本類型或任何原始包裝器類型
  • 任何Java 日期類型,或者
  • BigDecimal或BigInteger

簡單生成的標識符:

如果我們希望自動生成ID值怎么辦? 為此,我們可以更進一步,在標識符字段上使用@GeneratedValue批注:

Java

@Entity public class Employee {@Id@GeneratedValuepublic Integer empId;... }

當使用@GeneratedValue時 ,Hibernate在保留實體的同時會為我們的id列生成值。 對我們而言,重要的是要記住, 我們只能自動生成整數類型( int,short或long )或UUID 。

此外,我們提供了四種不同的密鑰生成策略,可自動生成標識符的值:

Hibernate使用AUTO密鑰生成策略作為默認策略。 從一個JPA持久性提供者到另一個JPA持久性提供者, AUTO策略的行為略有不同。 對于 Hibernate,如果 identifier屬性的類型為UUID,則它使用UUIDGenerator或默認為序列生成策略。

僅在Hibernate 5和更高版本中支持UUID生成,并且長度為36個字符:

Java

@Entity public class Employee {@Id@GeneratedValueprivate UUID empId;... }

生成的UUID的格式為“ 4ee5a777-7981-4e01-06ab-19aabb2eaa122”。

對于IDENTITY生成策略,Hibernate使用IdentityGenerator生成標識符值。 這些值由數據庫的標識列生成,并自動遞增:

Java

@Entity public class Employee {@Id@GeneratedValue (strategy = GenerationType.IDENTITY)private Integer empId;... }

使用此策略的主要缺點是它不支持批量JDBC插入。

在這里,顧名思義,數據庫序列用于生成我們的標識符的值。 Hibernate在內部使用SequenceStyleGenerator類來實現它。 如果我們的數據庫不支持序列,它將自動切換到TABLE密鑰生成策略。

SEQUENCE生成器為每個序列生成唯一的值。 我們可以指定我們希望使用的數據庫順序:

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;... }

為我們的標識符字段生成值。

Hibernate TableGenerator使用一個表,該表能夠保存標識符生成值的多個段。 除非指定,否則Hibernate默認使用hibernate_sequences表:

Java

@Entity public class Employee {@Id@GeneratedValue(strategy = GenerationType.TABLE)public Integer empId;... }

我們可以使用@TableGenerator來指定用于生成值的數據庫表:

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策略的伸縮性不是很好,而且性能很差,因此在實際的實現中很少使用。 對于所有支持序列的數據庫,我們應該始終偏向于使用SEQUENCE生成策略,而大多數現代數據庫通常都會這樣做。

復合標識符:

Hibernate還允許我們定義一個復合標識符。 要定義組合標識符,我們創建一個主鍵類,其中包含構成組合鍵的持久屬性。 根據JPA規范, 我們的主鍵類必須為:

  • 用@EmbeddedId或@IdClass注釋進行注釋
  • 公開并有一個公開的無參數構造函數
  • 可序列化
  • 實現equals()和hashCode()方法
  • 組成合成的屬性可以是basic,composite或ManyToOne。 但是,集合和OneToOne屬性被認為不合適。

    1.使用

    定義和使用復合鍵的一種方法是使用@EmbeddedId批注。

    因此,讓我們開始定義主鍵類并使用@Embeddable對其進行注釋 :

    Java

    @Embeddable public class EmployeePurchasesPK implements Serializable {private long empId;private long productId;//equals() and hashCode() methods... }

    現在,我們可以使用@EmbeddedId批注輕松地從我們的實體中引用此類:

    Java

    @Entity public class EmployeePurchases {@EmbeddedIdprivate EmployeePurchasesPK primaryAttributes;... }

    要使用我們的實體類設置或檢索主鍵屬性,我們將具有以下內容:

    Java

    EmployeePurchasesPK primaryAttributes = new EmployeePurchasesPK(); primaryAttributes.setEmpId(1001); primaryAttributes.setProductId(7822);EmployeePurchases empPurchases = new EmployeePurchases(); empPurchases.setPrimaryAttributes(primaryAttributes); ...

    顯然,我們的EmployeePurchases實體具有一個由empId和productId組成的復合鍵。

    2.使用

    使用@IdClass創建復合鍵時,可以使用@Id批注在主類中定義所有合成屬性。 我們的主鍵類中的代碼保持原樣,但僅充當“影子” :

    Java

    @Entity @IdClass(EmployeePurchasesPK.class) public class EmployeePurchases {@Idprivate long empId;@Idprivate long productId;...}

    通過這種方法,我們可以使用主要實體類的getter / setter方法直接設置鍵值:

    Java

    EmployeePurchases empPurchases = new EmployeePurchases(); empPurchases.setEmpId(1011); empPurchases.setProductId(9331); ...

    但是,此方法無法為我們提供標識符和實體對象之間的清晰區分。

    派生標識符:

    在Hibernate中,我們可以選擇使用@MapsId注釋從其關聯之一復制實體的標識符值

    Java

    public class EmployeeHistory {@Idprivate long id;@OneToOne@MapsIdprivate Employee employee;...}

    在這里,我們的EmployeeHistory實例將具有與相應Employee實例完全相同的ID 。

    結論:

    在本教程中,我們研究了在Hibernate中定義標識符的多種方法。 我們還介紹了不同的關鍵自動生成策略。

    成為第一個發表評論的人。

    翻譯自: https://www.javacodegeeks.com/2019/04/identifiers-hibernate.html

    hibernate 標識符

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。