为了账号安全,请及时绑定邮箱和手机立即绑定

SpringBoot-Hibernate-Mysql id 主键值序列使用

SpringBoot-Hibernate-Mysql id 主键值序列使用

长风秋雁 2021-11-24 19:09:22
我有两个类/域 ( Person) 和 ( Account),它们都有 id 字段@GeneratedValue(strategy = GeneratedType.AUTO)或任何其他字段GeneratedType,但是保存域会导致它们共享主键的序列。当我保存个人域时,它将使用id=1,然后保存帐户将使用id=2即使它们是完全不同的域,我不想要这个,已经搜索了很长时间但我不知道要搜索的关键字。编辑:将宠物更改为帐户我使用 Spring Boot 2.0.4.RELEASE 和 spring-boot-starter-data-jpa。MySql 是 8.0我有一个 mappingSuperclass 域类,但是即使我将 Id 分别放在每个类中,它的行为仍然相同..领域类package com.myband.band.domain;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.MappedSuperclass;@MappedSuperclasspublic abstract class Domain {    @Id    @GeneratedValue(strategy = GenerationType.AUTO)    private Long id;    private int version;    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public int getVersion() {        return version;    }    public void setVersion(int version) {        this.version = version;    }}人物类package com.myband.band.domain;import javax.persistence.Entity;@Entitypublic class Person extends Domain {    private String firstName;    private String lastName;    private String nickName;    private int age;    public String getFirstName() {        return firstName;    }    public void setFirstName(String firstName) {        this.firstName = firstName;    }    public String getLastName() {        return lastName;    }    public void setLastName(String lastName) {        this.lastName = lastName;    }    public String getNickName() {        return nickName;    }    public void setNickName(String nickName) {        this.nickName = nickName;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}
查看完整描述

2 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

当您使用 时@GeneratedValue(strategy = GenerationType.AUTO),您的表不是使用 mysql 中的自动增量功能创建的。如果您想将该功能用于主键,请@GeneratedValue(strategy = GenerationType.IDENTITY)改用。

请参阅Gergely Bacso的回答以了解GenerationType.AUTO工作原理。


查看完整回答
反对 回复 2021-11-24
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

您可以通过将 ID 定义更改为以下内容来解决此问题:



@Id

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pet_generator")

@SequenceGenerator(name="pet_generator", sequenceName = "pet_seq")


当前发生在您身上的是:

您定义了"AUTO"ID 生成逻辑,默认使用 DB 序列,但是因为您没有指定任何序列,Hibernate 决定使用一个单一的公共序列,在所有实体定义之间共享。


查看完整回答
反对 回复 2021-11-24
  • 2 回答
  • 0 关注
  • 235 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信