Java SpringBoot Hibernate Mysql id主键值序列在我的所有域中使用@GeneratedValue共享

Java SpringBoot Hibernate Mysql id主键值序列在我的所有域中使用@GeneratedValue共享,java,mysql,spring,hibernate,Java,Mysql,Spring,Hibernate,我有两个类/域(Person)和(Account),它们都有id字段,id字段具有@GeneratedValue(strategy=GeneratedType.AUTO)或任何其他GeneratedType,但保存域会导致它们共享主键序列 当我保存个人域时,它将使用id=1,然后保存帐户将使用id=2,即使它们是完全不同的域,我不想要这个,搜索了很长时间,但我不知道要搜索的关键字 编辑:将宠物更改为帐户 Im使用Spring Boot 2.0.4.0版本,发布Spring Boot启动器数据jp

我有两个类/域(
Person
)和(
Account
),它们都有id字段,id字段具有
@GeneratedValue(strategy=GeneratedType.AUTO)
或任何其他
GeneratedType
,但保存域会导致它们共享主键序列

当我保存个人域时,它将使用
id=1
,然后保存帐户将使用
id=2
,即使它们是完全不同的域,我不想要这个,搜索了很长时间,但我不知道要搜索的关键字

编辑:将宠物更改为帐户

Im使用Spring Boot 2.0.4.0版本,发布Spring Boot启动器数据jpa

MySql是8.0

我有一个mappedSuperclass域类,但即使我将Id分别放在每个类中,它仍然具有相同的行为

域类

package com.myband.band.domain;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;

@MappedSuperclass
public 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;

@Entity
public 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;
    }

}
帐户类别

package com.myband.login.domain;

import javax.persistence.Entity;

import com.myband.band.domain.Domain;

@Entity
public class Account extends Domain {

    private String username;

    public Account() {
    }

    public Account(String username) {
        super();
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

}

您可以通过将ID定义更改为:


@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“pet_generator”)
@SequenceGenerator(name=“pet_generator”,sequenceName=“pet_seq”)

目前发生在您身上的是:

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

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


请参考您的答案以了解
GenerationType.AUTO
的工作原理。

请添加您的
Person
Pet
类。另外,请包括生成/填充/保存对象的方法。如果您也发布spring和hibernate版本,那就太好了。这不起作用,我也为这两个版本都提供了一个超类,但是在MappedSuperclass注释上,它有id字段。在这种情况下,您应该不会对共享id对象感到惊讶。如果要将它们分开,需要开始在entityclass级别定义它们,并指定单个的
生成器。
。不,即使我单独放置id,它仍然会这样做。域类是mappedSuperclass,这意味着子类是类的所有者。这也是我们在工作中所做的,所以我不知道为什么它不工作,也许有一个配置我没有设置。域类不是我的designIdentity作品中的实体,谢谢。我的印象是MySql使用了它。谢谢