Java主鍵生成之@Id和@GeneratedValue使用詳解
引言
在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
注解有兩個重要的屬性:strategy
和generator
。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
指定了用于生成主鍵的表名,pkColumnName
和valueColumnName
分別指定了主鍵列和值列的名稱,pkColumnValue
指定了該實體類對應的主鍵值。
總結
@Id
和@GeneratedValue
注解是JPA中用于定義主鍵和主鍵生成策略的重要注解。@Id
注解用于標識實體類的屬性為主鍵,而@GeneratedValue
注解則用于指定主鍵的生成策略。JPA提供了多種主鍵生成策略,包括AUTO
、IDENTITY
、SEQUENCE
和TABLE
,每種策略都有其適用的場景和數(shù)據(jù)庫類型。開發(fā)者需要根據(jù)具體的數(shù)據(jù)庫和業(yè)務需求選擇合適的主鍵生成策略,以確保數(shù)據(jù)的完整性和一致性,同時提高開發(fā)效率。
以上就是Java主鍵生成之@Id和@GeneratedValue使用詳解的詳細內(nèi)容,更多關于Java @Id和@GeneratedValue的資料請關注腳本之家其它相關文章!
相關文章
MyBatis批量插入的五種方式小結(MyBatis以集合方式批量新增)
本文主要介紹了MyBatis批量插入的五種方式小結(MyBatis以集合方式批量新增),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01Java mysql數(shù)據(jù)庫并進行內(nèi)容查詢實例代碼
這篇文章主要介紹了Java mysql數(shù)據(jù)庫并進行內(nèi)容查詢實例代碼的相關資料,需要的朋友可以參考下2016-11-11