Java Hibernate在插入一定数量后生成负id
我的应用程序中有一个奇怪的Hibernate行为(3.6.1.Final),我现在非常绝望。这种行为发生在Amazon上的MariaDB 10.1和RDS上 在一定数量的成功持续后(始终在~5k左右),Hibernate将触发:Java Hibernate在插入一定数量后生成负id,java,mysql,hibernate,Java,Mysql,Hibernate,我的应用程序中有一个奇怪的Hibernate行为(3.6.1.Final),我现在非常绝望。这种行为发生在Amazon上的MariaDB 10.1和RDS上 在一定数量的成功持续后(始终在~5k左右),Hibernate将触发: SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails 从stacktrace中我看到,Hibernate尝试
SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails
从stacktrace中我看到,Hibernate尝试使用违反FK约束的负值来填充实体中的外键(FK的目标表没有这样的主键值)
奇怪的是:
- 只有在大约5公里成功行驶后才会发生这种情况
- 在提交了如此多的持久化操作之后,即使我重新启动应用程序(以及数据库),也会发生错误。唯一的解决办法是清除数据库并重复
- 错误与加载无关(连续、成批、单线程或多线程)
@Entity
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Charge extends Entry {
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "totalId")
private Amount total;
//....
这就是在金额实体中定义主键的方式:
@GeneratedValue
@Id
@Column(nullable = false)
private Integer pk;
//....
我的问题是:
- 为什么FK中出现无效的负值?(FK所针对的主键设置为自动递增,从一个插入开始,所有前面的插入都会相应地完美工作)
- 为什么只有在~5k持续后才会出现错误
- 为什么连重启应用程序都不能解决这个问题呢?DB很好,因为在应用程序外部手动插入可以工作(使用有效的FK值)
@Id
@GeneratedValue (strategy = GenerationType.AUTO)
@Column (name = "id")
private long id;
我们有完全相同的问题,这是由于旧的mariadb jdbc驱动程序。我们使用的是1.4.2版
切换到mariadb jdbc驱动程序的1.5.5版后,问题消失了数据库端的主键是如何定义的?什么负值<代码>-1?还是一些随机的负值?绝对值是否与任何现有外键匹配?Amount表DB上的主键定义如下:
pk
int(11)NOT NULL AUTO_INCREMENT,负值大约是一个高负数,类似于-32656或类似的值。据我在源代码中看到,默认策略已经是AUTO,5k仍然在整数范围内,自动装箱可能会抛出npe而不是奇怪的负值,但我同意这值得尝试太久,我无能为力,这很奇怪:(下面是有关MariaDB Connector-J项目的相关错误报告