【问题标题】:Spring with Hibernate: Duplicate entry for key 'PRIMARY'Spring with Hibernate:键“PRIMARY”的重复条目
【发布时间】:2018-01-08 14:48:12
【问题描述】:

我用 Spring Web 和 Hibernate 开发了一个 REST-API。 我将它部署在两个服务器实例中,它运行了大约 5 个月没有任何问题。现在它大部分都在工作,但在某些时期“MySQLIntegrityConstraintViolationException”会抛出消息“Duplicate entry '235648' for key 'PRIMARY'”(重复的 id 在例外)。

引发异常的类如下所示:

@Entity
@Table(name = "Metadata", catalog = "data")
public class Metadata{
    private Long id;
    private String field1;  
    private String field2;
    //...           

    @Id
    @Column(unique = true, nullable = false)
    @GeneratedValue(strategy = GenerationType.TABLE)
    public Long getId() {
        return id;
    }
    //More Getters and Setters...
}

Java 代码没有变化,MySql 数据库也没有变化。 您知道它为什么停止正常工作吗?

【问题讨论】:

  • 您是否在数据库中手动输入了一些行?
  • 生成表是hibernate创建的吗?还是数据库中已经存在一个?
  • 设置GenerationType.AUTO
  • @KedarJoshi:没有。我没有输入任何行。
  • @MaciejKowalski:是的,表是由 hibernate 创建的,并且工作了几个月。

标签: java spring hibernate jpa primary-key


【解决方案1】:

最有可能的是,最终创建使用该表生成 id 的实体的请求数量有所增加。

其中一种补救方法是在父方法中捕获该异常并重试(这可能是某种PessimisticLock 异常,因为在检索和更新其内容时,id 表必须被物理锁定)。

另一种方法是增加allocationSize 选项,如果没有进行自定义设置,则默认值为 50。您需要重新输入休眠默认表/列名称,因为这已经在数据库中创建:

@Id
@Column(unique = true, nullable = false)
@TableGenerator(
        name="tableGen", 
        table="hibernate_sequences", 
        pkColumnName="sequence_name", 
        valueColumnName="next_val", 
        pkColumnValue="default",
        allocationSize=100 
@GeneratedValue(strategy = GenerationType.TABLE, generator="tableGen")
public Long getId() {
    return id;
}

这是一篇很好的文章,它解释了 TABLE 生成策略的可伸缩性缺陷 -> link

【讨论】:

  • 好吧,帖子解释说,应用程序会变慢。当然,这不好,但是重复的主键对我来说听起来像是另一个问题。 'allocationSize' 到底是做什么的?
  • 当对该id表的请求数量增加时,就会发生这种异常。这意味着当一个请求为自己的需要锁定表时,另一个请求也尝试这样做,但由于锁定而无法执行,因此例外。如果增加分配大小,则会减少到该表的往返次数,理论上会减少发生该异常的机会
  • 这种解释仍然没有意义。如果请求无法锁定序列表,则预期会出现某种 CannotLockException。主键的重复条目意味着序列已经生成了一个 ID。但这个 ID - 不知何故 - 已经在使用中了。
【解决方案2】:
@GeneratedValue(strategy = GenerationType.IDENTITY)

为我工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-10
    • 2016-10-25
    • 2019-04-04
    • 2014-05-30
    • 2017-06-19
    • 2017-02-17
    • 2012-10-13
    • 2012-07-23
    相关资源
    最近更新 更多