欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java主鍵生成之@Id和@GeneratedValue使用詳解

 更新時(shí)間:2025年05月10日 15:05:38   作者:程序媛學(xué)姐  
這篇文章主要介紹了Java主鍵生成之@Id和@GeneratedValue的使用,@Id和@GeneratedValue注解就是JPA中用于定義主鍵和主鍵生成策略的關(guān)鍵注解,理解這兩個(gè)注解的使用和不同的主鍵生成策略,對(duì)于開發(fā)高效、穩(wěn)定的數(shù)據(jù)持久化應(yīng)用至關(guān)重要,需要的朋友可以參考下

引言

在Java的企業(yè)級(jí)開發(fā)中,數(shù)據(jù)庫(kù)操作是必不可少的一部分。而在數(shù)據(jù)庫(kù)表中,主鍵是唯一標(biāo)識(shí)每條記錄的重要字段。在使用JPA(Java Persistence API)進(jìn)行對(duì)象 - 關(guān)系映射時(shí),需要為實(shí)體類指定主鍵,并確定主鍵的生成策略。@Id@GeneratedValue注解就是JPA中用于定義主鍵和主鍵生成策略的關(guān)鍵注解。理解這兩個(gè)注解的使用和不同的主鍵生成策略,對(duì)于開發(fā)高效、穩(wěn)定的數(shù)據(jù)持久化應(yīng)用至關(guān)重要。

一、@Id注解的作用

@Id注解是JPA中用于標(biāo)識(shí)實(shí)體類的屬性為主鍵的注解。在JPA實(shí)體類中,必須有一個(gè)屬性被@Id注解標(biāo)記,以此來(lái)指定該屬性對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的主鍵列。主鍵在數(shù)據(jù)庫(kù)中具有唯一性,用于唯一標(biāo)識(shí)表中的每一條記錄。以下是一個(gè)簡(jiǎn)單的示例:

import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Employee {
    @Id
    private Long id;
    private String name;
    private String department;
    public Employee() {
    }
    public Employee(Long id, String name, String department) {
        this.id = id;
        this.name = name;
        this.department = department;
    }
    // Getters and Setters
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDepartment() {
        return department;
    }
    public void setDepartment(String department) {
        this.department = department;
    }
}

在這個(gè)示例中,id屬性被@Id注解標(biāo)記為主鍵。

二、@GeneratedValue注解概述

@GeneratedValue注解用于指定主鍵的生成策略。當(dāng)使用@Id注解標(biāo)記了主鍵屬性后,可以使用@GeneratedValue注解來(lái)定義該主鍵的值是如何生成的。@GeneratedValue注解有兩個(gè)重要的屬性:strategygenerator。strategy屬性用于指定主鍵生成策略,generator屬性用于指定自定義的主鍵生成器。

三、不同的主鍵生成策略

1. GenerationType.AUTO

GenerationType.AUTO@GeneratedValue注解的默認(rèn)策略。JPA會(huì)根據(jù)底層數(shù)據(jù)庫(kù)的特性自動(dòng)選擇合適的主鍵生成策略。例如,對(duì)于支持自增主鍵的數(shù)據(jù)庫(kù)(如MySQL),JPA可能會(huì)選擇自增策略;對(duì)于不支持自增主鍵的數(shù)據(jù)庫(kù),可能會(huì)選擇其他策略。示例如下:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private double price;
    public Product() {
    }
    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }
    // Getters and Setters
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
}

在這個(gè)示例中,id屬性的主鍵生成策略為AUTO。

2. GenerationType.IDENTITY

GenerationType.IDENTITY策略適用于支持自增主鍵的數(shù)據(jù)庫(kù),如MySQL、SQL Server等。使用該策略時(shí),數(shù)據(jù)庫(kù)會(huì)自動(dòng)為新插入的記錄生成一個(gè)唯一的自增主鍵值。示例如下:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;
    public Customer() {
    }
    public Customer(String name, String email) {
        this.name = name;
        this.email = email;
    }
    // Getters and Setters
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}

在這個(gè)示例中,id屬性的主鍵生成策略為IDENTITY,數(shù)據(jù)庫(kù)會(huì)自動(dòng)為新插入的Customer記錄生成自增的id值。

3. GenerationType.SEQUENCE

GenerationType.SEQUENCE策略適用于支持序列(Sequence)的數(shù)據(jù)庫(kù),如Oracle、PostgreSQL等。序列是數(shù)據(jù)庫(kù)中用于生成唯一數(shù)字的對(duì)象。使用該策略時(shí),需要在數(shù)據(jù)庫(kù)中創(chuàng)建對(duì)應(yīng)的序列,并在@GeneratedValue注解中指定序列的名稱。示例如下:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "order_seq")
    @SequenceGenerator(name = "order_seq", sequenceName = "ORDER_SEQ", allocationSize = 1)
    private Long id;
    private String orderNumber;
    private double totalAmount;
    public Order() {
    }
    public Order(String orderNumber, double totalAmount) {
        this.orderNumber = orderNumber;
        this.totalAmount = totalAmount;
    }
    // Getters and Setters
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getOrderNumber() {
        return orderNumber;
    }
    public void setOrderNumber(String orderNumber) {
        this.orderNumber = orderNumber;
    }
    public double getTotalAmount() {
        return totalAmount;
    }
    public void setTotalAmount(double totalAmount) {
        this.totalAmount = totalAmount;
    }
}

在這個(gè)示例中,@SequenceGenerator注解定義了一個(gè)名為order_seq的序列生成器,sequenceName指定了數(shù)據(jù)庫(kù)中序列的名稱,allocationSize指定了每次從序列中獲取的號(hào)碼數(shù)量。

4. GenerationType.TABLE

GenerationType.TABLE策略使用一個(gè)數(shù)據(jù)庫(kù)表來(lái)模擬序列的功能,以生成唯一的主鍵值。這種策略適用于不支持序列的數(shù)據(jù)庫(kù),或者需要在多個(gè)數(shù)據(jù)庫(kù)之間保持主鍵生成的一致性。示例如下:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.TableGenerator;
@Entity
public class Supplier {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "supplier_gen")
    @TableGenerator(name = "supplier_gen", table = "ID_GENERATOR_TABLE", pkColumnName = "GEN_KEY", valueColumnName = "GEN_VALUE", pkColumnValue = "SUPPLIER_PK", allocationSize = 1)
    private Long id;
    private String name;
    private String contactInfo;
    public Supplier() {
    }
    public Supplier(String name, String contactInfo) {
        this.name = name;
        this.contactInfo = contactInfo;
    }
    // Getters and Setters
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getContactInfo() {
        return contactInfo;
    }
    public void setContactInfo(String contactInfo) {
        this.contactInfo = contactInfo;
    }
}

在這個(gè)示例中,@TableGenerator注解定義了一個(gè)名為supplier_gen的表生成器,table指定了用于生成主鍵的表名,pkColumnNamevalueColumnName分別指定了主鍵列和值列的名稱,pkColumnValue指定了該實(shí)體類對(duì)應(yīng)的主鍵值。

總結(jié)

@Id@GeneratedValue注解是JPA中用于定義主鍵和主鍵生成策略的重要注解。@Id注解用于標(biāo)識(shí)實(shí)體類的屬性為主鍵,而@GeneratedValue注解則用于指定主鍵的生成策略。JPA提供了多種主鍵生成策略,包括AUTO、IDENTITY、SEQUENCETABLE,每種策略都有其適用的場(chǎng)景和數(shù)據(jù)庫(kù)類型。開發(fā)者需要根據(jù)具體的數(shù)據(jù)庫(kù)和業(yè)務(wù)需求選擇合適的主鍵生成策略,以確保數(shù)據(jù)的完整性和一致性,同時(shí)提高開發(fā)效率。

以上就是Java主鍵生成之@Id和@GeneratedValue使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Java @Id和@GeneratedValue的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JDK1.8中的ConcurrentHashMap源碼分析

    JDK1.8中的ConcurrentHashMap源碼分析

    這篇文章主要介紹了JDK1.8中的ConcurrentHashMap源碼分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • MyBatis批量插入的五種方式小結(jié)(MyBatis以集合方式批量新增)

    MyBatis批量插入的五種方式小結(jié)(MyBatis以集合方式批量新增)

    本文主要介紹了MyBatis批量插入的五種方式小結(jié)(MyBatis以集合方式批量新增),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Windows中Tomcat整合到Eclipse的圖文教程

    Windows中Tomcat整合到Eclipse的圖文教程

    下面小編就為大家?guī)?lái)一篇Windows中Tomcat整合到Eclipse的圖文教程。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Java連接超時(shí)的幾種情況以及讀取代碼

    Java連接超時(shí)的幾種情況以及讀取代碼

    在Java編程中連接超時(shí)異常是指在建立網(wǎng)絡(luò)連接時(shí),無(wú)法在給定的時(shí)間內(nèi)成功建立連接的異常,這篇文章主要給大家介紹了關(guān)于Java連接超時(shí)的幾種情況以及讀取的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • Java  mysql數(shù)據(jù)庫(kù)并進(jìn)行內(nèi)容查詢實(shí)例代碼

    Java mysql數(shù)據(jù)庫(kù)并進(jìn)行內(nèi)容查詢實(shí)例代碼

    這篇文章主要介紹了Java mysql數(shù)據(jù)庫(kù)并進(jìn)行內(nèi)容查詢實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • JAVA多線程之方法 JOIN詳解及實(shí)例代碼

    JAVA多線程之方法 JOIN詳解及實(shí)例代碼

    這篇文章主要介紹了JAVA多線程之方法 JOIN詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • java集合Collection常用方法解讀

    java集合Collection常用方法解讀

    這篇文章主要介紹了java集合Collection常用方法解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Mybatis-plus多條件篩選分頁(yè)的實(shí)現(xiàn)

    Mybatis-plus多條件篩選分頁(yè)的實(shí)現(xiàn)

    本文主要介紹了Mybatis-plus多條件篩選分頁(yè),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Spring Bean的屬性注入方式

    Spring Bean的屬性注入方式

    這篇文章主要介紹了Spring Bean的屬性注入方式的相關(guān)資料,需要的朋友可以參考下
    2018-02-02
  • Spring中的集合注入代碼實(shí)例

    Spring中的集合注入代碼實(shí)例

    這篇文章主要介紹了Spring中的集合注入代碼實(shí)例,集合注入是指在Spring框架中,通過(guò)配置文件或注解的方式將集合類型的數(shù)據(jù)注入到Bean中,集合類型包括List、Set、Map和Properties等,需要的朋友可以參考下
    2023-11-11

最新評(píng)論