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使用了它。谢谢