SpringBoot-Hibernate-Mysql id 主键值序列使用 @GeneratedValue 在我的所有域



我有两个类/域(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

我有一个映射的超类域类,但即使我为每个类单独放置 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;
}
}

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

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

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

@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pet_generator") @SequenceGenerator(name="pet_generator", sequenceName = "pet_seq")

目前发生在您身上的是:
您定义了"AUTO"ID 生成逻辑,这默认为使用数据库序列,但由于您没有指定任何序列,Hibernate 决定使用在所有实体定义之间共享的单个通用序列。

最新更新