Spring with Hibernate:密钥' PRIMARY'

时间:2018-01-08 14:48:13

标签: java spring hibernate jpa primary-key

我使用Spring Web和Hibernate开发了一个REST-API。 我将它部署在两个服务器实例中,它运行大约5个月没有任何问题。现在它主要是工作但在某些时期" MySQLIntegrityConstraintViolationException "有消息" 重复条目' 235648'关键' 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数据库进行更改。 你知道为什么它不能正常工作吗?

2 个答案:

答案 0 :(得分:2)

最有可能的是,最终创建使用该表生成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;
}

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

答案 1 :(得分:0)

@GeneratedValue(strategy = GenerationType.IDENTITY)

为我工作。