当前位置: 代码网 > it编程>编程语言>Java > Java主键生成之@Id和@GeneratedValue使用详解

Java主键生成之@Id和@GeneratedValue使用详解

2025年05月11日 Java 我要评论
引言在java的企业级开发中,数据库操作是必不可少的一部分。而在数据库表中,主键是唯一标识每条记录的重要字段。在使用jpa(java persistence api)进行对象 - 关系映射时,需要为实

引言

在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注解有两个重要的属性:strategygeneratorstrategy属性用于指定主键生成策略,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指定了用于生成主键的表名,pkcolumnnamevaluecolumnname分别指定了主键列和值列的名称,pkcolumnvalue指定了该实体类对应的主键值。

总结

@id@generatedvalue注解是jpa中用于定义主键和主键生成策略的重要注解。@id注解用于标识实体类的属性为主键,而@generatedvalue注解则用于指定主键的生成策略。jpa提供了多种主键生成策略,包括autoidentitysequencetable,每种策略都有其适用的场景和数据库类型。开发者需要根据具体的数据库和业务需求选择合适的主键生成策略,以确保数据的完整性和一致性,同时提高开发效率。

以上就是java主键生成之@id和@generatedvalue使用详解的详细内容,更多关于java @id和@generatedvalue的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com