引言
在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.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会根据底层数据库的特性自动选择合适的主键生成策略。例如,对于支持自增主键的数据库(如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的资料请关注代码网其它相关文章!
发表评论