我有两个类/域(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 决定使用在所有实体定义之间共享的单个通用序列。