Java Hibernate在插入一定数量后生成负id

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尝试

我的应用程序中有一个奇怪的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尝试使用违反FK约束的负值来填充实体中的外键(FK的目标表没有这样的主键值)

奇怪的是:

  • 只有在大约5公里成功行驶后才会发生这种情况
  • 在提交了如此多的持久化操作之后,即使我重新启动应用程序(以及数据库),也会发生错误。唯一的解决办法是清除数据库并重复
  • 错误与加载无关(连续、成批、单线程或多线程)
以下是插入期间违反的实体的FK:

    @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值)
我怀疑的是Hibernate以及它如何管理DB上的自动增量。关于这个主题的文章很多,但没有一篇适合我的具体情况(错误只发生在特定用法之后)

最后注意:在DB auto_上,增量最初设置为1。Amount实体的所有初始持续存在(错误出现之前)都有一个增量主键,以1:(1,2,3,…)开始。那么,为什么Hibernate在一段时间后会出现一个否定的结果(与FK不兼容)

非常感谢您的帮助

最好的 G.

可能是int型的极限? 试试这个:

@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项目的相关错误报告