Java主鍵生成之@Id和@GeneratedValue使用詳解
引言
在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è)重要的屬性:strategy和generator。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指定了用于生成主鍵的表名,pkColumnName和valueColumnName分別指定了主鍵列和值列的名稱,pkColumnValue指定了該實(shí)體類對(duì)應(yīng)的主鍵值。
總結(jié)
@Id和@GeneratedValue注解是JPA中用于定義主鍵和主鍵生成策略的重要注解。@Id注解用于標(biāo)識(shí)實(shí)體類的屬性為主鍵,而@GeneratedValue注解則用于指定主鍵的生成策略。JPA提供了多種主鍵生成策略,包括AUTO、IDENTITY、SEQUENCE和TABLE,每種策略都有其適用的場(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)文章
MyBatis批量插入的五種方式小結(jié)(MyBatis以集合方式批量新增)
本文主要介紹了MyBatis批量插入的五種方式小結(jié)(MyBatis以集合方式批量新增),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
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
Mybatis-plus多條件篩選分頁(yè)的實(shí)現(xiàn)
本文主要介紹了Mybatis-plus多條件篩選分頁(yè),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09

