mysql - Spring boot - 通过SQL插入数据后自增问题

标签 mysql spring spring-boot hibernate

我正在开发一个 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/

相关文章:

java - Spring + hibernate + HikariCP : how to handle DB connection while doing long running REST call?

MySQL AUTO DECREMENT 而不是 AUTO INCREMENT,这可能吗?

Spring Security logout-success-url 不被认可

Mysql 使用 group by 进行查询?

java - spring 写回属性文件

java - 在 Spring Data JPA 中使用 @Transactional 注解的层

spring - 如何在 spring boot 2.1.9 中配置 ssl 证书

spring-boot - Gradle 多模块项目 java.lang.NoClassDeffFoundError

php - 在php和mysql中将blob类型转换为base64时显示半张图像

ASP.NET 和 MySQL .Net Framework 数据提供程序问题