java - Spring 与 hibernate : Duplicate entry for key 'PRIMARY'

标签 java spring hibernate jpa primary-key

我使用 Spring Web 和 Hibernate 开发了一个 REST-API。 我将它部署在两个服务器实例中,它运行了大约 5 个月没有任何问题。现在它大部分工作正常,但在某些时期会抛出“MySQLIntegrityConstraintViolationException”,并显示消息“键“PRIMARY”的重复条目“235648””(重复的 id 正在更改)异常(exception))。

引发异常的类如下所示:

@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 数据库也没有改变。 您知道为什么它无法正常工作吗?

最佳答案

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

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

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

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

这是一篇很好的文章,解释了表生成策略的可扩展性陷阱 -> link

关于java - Spring 与 hibernate : Duplicate entry for key 'PRIMARY' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48152646/

相关文章:

java - Spring MVC 不从 webapp 加载静态资源

java - 转换模型的最佳方法

java - Hibernate:insertable = false,updatable = false 属于涉及外键的复合主键星座中的哪里?

java - Hibernate 中的表级锁

java - 除了使用 Cursor 之外,还有其他方法从 SQLite 数据库获取数据吗?

java - 我如何更改其中一门类(class),以便允许学生以多个分数参加多项测试?

java - 将颜色代码与颜色进行比较

java - SQLGrammarException : could not prepare statement]

sql-server - 使用 Seam & Hibernate 重试事务的最佳方式

java - 我的简单 antlr 语法有什么问题?