Java主键生成之@Id和@GeneratedValue使用详解
目录
- 引言
- 一、@Id注解的作用
- 二、@GeneratedValue注解概述
- 三、不同的主键生成策略
- 1. GenerationType.AUTO
- 2. Gehttp://www.devze.comnerationType.IDENTITY
- 3. GenerationType.SEQUENCE
- 4. GenerationType.TABLE
- 总结
引言
在Java的企业级开发中,数据库操作是必不可少的一部分。而在数据库表中,主键是唯一标识每条记录的重要字段。在使用JPA(Java Persistence API)进行对象 - 关系映射时,需要为实体类指定主键,并确定主键的生成策略。@Id
和@GeneratedValue
注解就是JPA中用于定义主键和主键生成策略的关键注解。理解这两个注解的使用和不同的主键生成策略,对于开发高效、稳定的数据持久化应用至关重要。
一、@Id注解的作用
@Id
注解是JPA中用于标识实体类的属性为主键的注解。在JPA实体类中,必须有一个属性被@Id
注解标记,以此来指定该属性对应数据库表中的主键列。主键在数据库中具有唯一性,用于唯一标识表中的每一条记录。以下是一个简单的示例:
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.iMcjCjIpd = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDepartment() { return department; } public void setDepartment(String departmenMcjCjIpt) { this.department = departmenhttp://www.devze.comt; } }
在这个示例中,id
属性被@Id
注解标记为主键。
二、@GeneratedValue注解概述
@GeneratedValue
注解用于指定主键的生成策略。当使用@Id
注解标记了主键属性后,可以使用@GeneratedValue
注解来定义该主键的值是如何生成的。@GeneratedValue
注解有两个重要的属性:strategy
和generator
。strategy
属性用于指定主键生成策略,generator
属性用于指定自定义的主键生成器。
三、不同的主键生成策略
1. GenerationType.AUTO
GenerationType.AUTO
是@GeneratedValue
注解的默认策略。JPA会根据底层数据库的特性自动选择合适的主键生成策略。例如,对于支持自增主键的数据库(如mysql),JPA可能会选择自增策略;对于不支持自增主键的数据库,可能会选择其他策略。示例如下:
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
策略适用于支持自增主键的数据库,如MySQL、SQL Server等。使用该策略时,数据库会自动为新插入的记录生成一个唯一的自增主键值。示例如下:
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
,数据库会自动为新插入的Customer
记录生成自增的id
值。
3. GenerationType.SEQUENCE
GenerationType.SEQUENCE
策略适用于支持序列(Sequence)的数据库,如oracle、PostgreSQL等。序列是数据库中用于生成唯一数字的对象。使用该策略时,需要在数据库中创建对应的序列,并在@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
指定了数据库中序列的名称,allocationSize
指定了每次从序列中获取的号码数量。
4. GenerationType.TABLE
GenerationType.TABLE
策略使用一个数据库表来模拟序列的功能,以生成唯一的主键值。这种策略适用于不支持序列的数据库,或者需要在多个数据库之间保持主键生成的一致性。示例如下:
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
,每种策略都有其适用的场景和数据库类型。开发者需要根据具体的数据库和业务需求选择合适的主键生成策略,以确保数据的完整性和一致性,同时提高开发效率。
以上就是Java主键生成之@Id和@GeneratedValue使用详解的详细内容,更多关于Java @Id和@GeneratedValue的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论