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

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

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

引言

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

一、@Id注解的作用

@Id注解是JPA中用于標識實體類的屬性為主鍵的注解。在JPA實體類中,必須有一個屬性被@Id注解標記,以此來指定該屬性對應數(shù)據(jù)庫表中的主鍵列。主鍵在數(shù)據(jù)庫中具有唯一性,用于唯一標識表中的每一條記錄。以下是一個簡單的示例:

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

在這個示例中,id屬性被@Id注解標記為主鍵。

二、@GeneratedValue注解概述

@GeneratedValue注解用于指定主鍵的生成策略。當使用@Id注解標記了主鍵屬性后,可以使用@GeneratedValue注解來定義該主鍵的值是如何生成的。@GeneratedValue注解有兩個重要的屬性:strategygenerator。strategy屬性用于指定主鍵生成策略,generator屬性用于指定自定義的主鍵生成器。

三、不同的主鍵生成策略

1. GenerationType.AUTO

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

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

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

2. GenerationType.IDENTITY

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

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

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

3. GenerationType.SEQUENCE

GenerationType.SEQUENCE策略適用于支持序列(Sequence)的數(shù)據(jù)庫,如Oracle、PostgreSQL等。序列是數(shù)據(jù)庫中用于生成唯一數(shù)字的對象。使用該策略時,需要在數(shù)據(jù)庫中創(chuà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;
    }
}

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

4. GenerationType.TABLE

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

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

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

總結

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

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

相關文章

  • JDK1.8中的ConcurrentHashMap源碼分析

    JDK1.8中的ConcurrentHashMap源碼分析

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

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

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

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

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

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

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

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

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

    JAVA多線程之方法 JOIN詳解及實例代碼

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

    java集合Collection常用方法解讀

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

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

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

    Spring Bean的屬性注入方式

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

    Spring中的集合注入代碼實例

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

最新評論