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

时间:2016-08-31 13:37:13

标签: 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尝试填充违反FK约束的负值的实体中的外键(FK的目标表没有这样的主键值)。

奇怪的是:

  • 只有在大约5k成功后才会发生
  • 提交此类持久操作后,即使重新启动应用程序(以及数据库),也会发生错误。唯一的解决方案是消灭数据库并重复。
  • 错误独立于负载(连续,批量,单线程或多线程)发生。

以下是插入过程中违反的实体的FK:

    @Entity
    @Cacheable
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    public class Charge extends Entry {

        @OneToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "totalId")
        private Amount total;
     //....

这就是Amount实体中主键的定义方式:

     @GeneratedValue
     @Id
     @Column(nullable = false)
     private Integer pk;
     //....

我的问题是:

  • 为什么FK中出现无效的负值? (FK所针对的主键被设置为自动增量,从一个开始,所有前面的插入都相应地完美地工作)
  • 为什么只有在~5k持续存在后才会发生错误?
  • 为什么即使重新启动应用程序也无法解决问题? DB很好,因为应用程序外部的手动插入工作(具有有效的FK值)

我怀疑是Hibernate以及它如何管理数据库上的auto_increment。关于该主题的帖子很多,但它们都不符合我的具体情况(仅在某次使用后才会发生错误)。

最后注意:在数据库中,auto_increment最初设置为1. Amount实体的所有初始持续(在错误出现之前)都有一个以1开头的增量PK:(1,2,3,...) 。那么为什么经过一段时间后Hibernate会出现负面影响(与FK不兼容)?

非常感谢您的帮助。

最佳

-G。

2 个答案:

答案 0 :(得分:2)

也许是int类型的限制?

试试这个:

@Id
@GeneratedValue (strategy = GenerationType.AUTO)
@Column (name = "id")
private long id;

答案 1 :(得分:0)

我们遇到了同样的问题,这是由于旧的mariadb jdbc驱动程序。我们使用的是版本1.4.2 切换到mariadb jdbc驱动程序的1.5.5版后,问题就消失了