引言
在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的资料请关注代码网其它相关文章!
发表评论