首页 > 解决方案 > SpringBoot-Hibernate-Mysql id 主键值序列在我的所有域中使用@GeneratedValue 共享

问题描述

我有两个类/域 ( Person) 和 ( Account),它们都有 id 字段 with @GeneratedValue(strategy = GeneratedType.AUTO)or any other GeneratedType,但是保存域会导致它们共享主键的序列。

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

编辑:将宠物更改为帐户

我将 Spring Boot 2.0.4.RELEASE 与 spring-boot-starter-data-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;
    }

}

标签: javamysqlspringhibernate

解决方案


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

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


推荐阅读