我正在开发一个 Spring Boot 项目,通过 Hibernate 链接到 MySQL 数据库。 当数据库开始为空时,一切运行正常。但是,当虚拟数据 data.sql 文件在启动应用程序之前运行,然后通过应用程序插入对象时,插入不会考虑以前的 ID,因此会导致重复条目,直到达到行数:
我会尝试用一个例子更好地解释:
- 在应用程序启动时,data.sql 文件会插入 3 个虚拟用户。
- 到达注册页面以添加新用户并提交时,Hibernate 返回错误“主键的重复条目“1””,然后“主键的重复条目“2””和“主键的重复条目“3”” ' 重试两次后。
- 第四次重试时,系统会添加用户。
因此,ID 会自动递增,但不会考虑之前通过 data.sql 插入的行。
请注意,我尝试使用 User 类的生成类型(AUTO/IDENTITY)但没有成功,并且我的 hibernate 数据源处于创建-删除模式。
更新: 用户实体:
@Data
@Builder
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "users")
public class User {
public final static Role DEFAULT_ROLE = new Role();
static {
DEFAULT_ROLE.setId(2);
DEFAULT_ROLE.setRole("NORMAL");
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
private int id;
@Column(name = "user_name")
@Length(min = 5, message = "*Your user name must have at least 5 characters")
@NotEmpty(message = "*Please provide a user name")
private String userName;
@Column(name = "email")
@Email(message = "*Please provide a valid Email")
@NotEmpty(message = "*Please provide an email")
private String email;
@Column(name = "password")
@Length(min = 5, message = "*Your password must have at least 5 characters")
@NotEmpty(message = "*Please provide your password")
private String password;
@Column(name = "name")
@NotEmpty(message = "*Please provide your name")
private String name;
@Column(name = "last_name")
@NotEmpty(message = "*Please provide your last name")
private String lastName;
@Column(name = "active")
private Boolean active;
@ManyToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;
@Column(name = "phone_number")
@NotEmpty(message = "*Please provide a phone number")
private String phoneNumber;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "address_id", referencedColumnName = "address_id")
private Address address;
}
知道什么可以解决这个问题吗? :)
干杯。
最佳答案
问题不在 Hibernate 中,而是在 data.sql
中的语句中。
在那些 INSERT
语句中,您可能为 user_id
列给出显式值,因此 MySQL 不会增加其 AUTO_INCRMENT
计数器。 Hibernate 对 MySQL 的默认生成策略是 IDENTITY
,它依赖于 AUTO_INCRMENT
功能。
最简单的解决方案是省略 INSERT
语句中的 users_id
列。不过,您也可以将表的初始 AUTO_INCRMENT
值设置为更高的数字:
ALTER TABLE users AUTO_INCREMENT=1001
编辑:您的身份字段被声明为int id
,因此它永远不能为null
。将其更改为 Integer
,以便 Hibernate 可以区分持久化实体 (id != null
) 和非持久化实体。
关于mysql - Spring boot - 通过SQL插入数据后自增问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65641697/