【问题标题】:Spring boot - Auto-increment problem after data insert through SQLSpring boot - 通过SQL插入数据后自动增量问题
【发布时间】:2021-01-09 10:42:24
【问题描述】:

我正在开发一个 spring boot 项目,通过 Hibernate 链接到 MySQL 数据库。 当数据库开始为空时,一切都运行良好。但是,当启动应用程序之前运行虚拟数据 data.sql 文件,然后通过应用程序插入对象时,插入不会考虑以前的 ID,因此会导致重复条目,直到达到行数:

我会尝试用一个例子更好地解释:

  • 在应用程序启动时,data.sql 文件插入 3 个虚拟用户。
  • 到达注册页面以添加新用户并提交时,Hibernate 返回错误“主键重复条目 1”,然后“主键重复条目 2”和主键重复条目 3 ' 重试两次后。
  • 在第四次重试时,添加用户。

因此 ID 会自动递增,但不会考虑之前通过 data.sql 插入的行。

请注意,我尝试过使用 User 类的生成类型(AUTO / IDENTITY)但没有成功,并且我的休眠数据源处于创建删除模式。

更新: 用户实体:

@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;

}

知道什么会解决它吗? :)

干杯。

【问题讨论】:

  • 您可以发布您的用户实体吗?也许那里有些错字......
  • 刚刚添加,谢谢!

标签: mysql spring spring-boot hibernate


【解决方案1】:

问题不在于 Hibernate,而在于 data.sql 中的语句。

在那些INSERT 语句中,您可能会为user_id 列提供显式值,因此MySQL 不会增加其AUTO_INCREMENT 计数器。 Hibernate 对 MySQL 的默认生成策略是IDENTITY,它依赖于AUTO_INCREMENT 特性。

最简单的解决方案是在INSERT 语句中省略users_id 列。但是,您也可以将表的初始 AUTO_INCREMENT 值设置为更大的数字:

ALTER TABLE users AUTO_INCREMENT=1001

编辑:您的身份字段被声明为int id,因此它永远不能是null。将其更改为 Integer,以便 Hibernate 可以区分持久化 (id != null) 和非持久化实体。

【讨论】:

  • 这对我有帮助,因为它确实将自动增量属性设置到 IntelliJ 的数据库视图中 - 我现在确定它可以运行。但是,它仍然返回相同的错误。我还注意到一些奇怪的事情:当设置 AUTO_INCREMENT=1001 时,它对于以下 INSERT 语句 (1002-1003) 的增量很好,但是错误仍然返回“主键的重复条目 1”,我期望“重复条目” 1001' 主键'...知道这是如何设置的吗?
  • 您的id 字段是原始类型int,因此它被初始化为0。将其更改为盒装类型Integer,一切正常。
猜你喜欢
  • 2020-02-13
  • 1970-01-01
  • 2017-06-22
  • 2013-08-03
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多