程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了JPA 2 @SequenceGenerator @GeneratedValue产生唯一约束冲突大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决JPA 2 @SequenceGenerator @GeneratedValue产生唯一约束冲突?

开发过程中遇到JPA 2 @SequenceGenerator @GeneratedValue产生唯一约束冲突的问题如何解决?下面主要结合日常开发的经验,给出你关于JPA 2 @SequenceGenerator @GeneratedValue产生唯一约束冲突的解决方法建议,希望对你解决JPA 2 @SequenceGenerator @GeneratedValue产生唯一约束冲突有所启发或帮助;
  1. 是的,您的分析是正确的。您已正确确定问题所在(我们有类似的问题)。而且…如果您要将其投入生产,请不要忘记:

    • 要么为具有正确的初始值/初始ID的新序列生成器手动生成序列表(否则,hibernate将从1开始,您将再次获得)
    • 或在代码中设置该值(签initalValue@SequenceGenerator)。
    • 我无法列举最佳实践,但我想您可以降低50的极限。我也没有POSTGResql的经验,但是在MysqL中,您有一个简单的seq表。generator和hibernate使整个过程变得完整。

解决方法

问题概述

在看似随机的时间,我们会收到一个异常“
POSTGReSQL重复键违反了唯一约束”。我确实认为我知道我们的问题是什么,但是我不想在没有可重现的测试用例的情况下对代码进行更改。但是由于除了随机生产之外,我们无法在任何环境中复制它,因此我要求SO的帮助。

在这个项目中,我们有多个POSTGRes数据库,并且为每个数据库中的每个表配置了主键序列。这些序列是这样创建的:

create sequence PERSONS_SEQ;
create sequence VISITS_SEQ;
etc...

我们使用以下序列来为实体生成主键,如下所示:

@Entity
@Table(name = "visits")
public class Visit {
  @Id
  @column(name = "id")
  @SequenceGenerator(name = "seq",sequencename = "visits_seq")
  @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "seq")
  private int id;
  ...
}

@Entity
@Table(name = "person")
public class Person {
  @Id
  @column(name = "id")
  @SequenceGenerator(name = "seq",sequencename = "persons_seq")
  @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "seq")
  private int id;
  ...
}

分析

我认为此配置存在2个问题:

1)两个@SequenceGenerators都指定相同的name属性,即使它们应该映射到不同的数据库序列。

2)@SequenceGenerator
diStributionSize属性默认为50(我们使用hibernate模式作为JPA提供程序),因此我认为创建序列语法应指定序列应增加多少,特别是增加50才能匹配alLOCATIOnSize。

基于这种猜测,我认为应该将代码修改为如下形式:

create sequence PERSONS_SEQ increment by 50;
create sequence VISITS_SEQ increment by 50;
etc...

@Entity
@Table(name = "visits")
public class Visit {
  @Id
  @column(name = "id")
  @SequenceGenerator(name = "visits_seq",generator = "visits_seq")
  private int id;
  ...
}

@Entity
@Table(name = "person")
public class Person {
  @Id
  @column(name = "id")
  @SequenceGenerator(name = "persons_seq",generator = "persons_seq")
  private int id;
  ...
}

我只是测试一下,而不是问SO的问题,但是同样,我们还无法在任何其他环境中重现此生产问题。甚至在生产中,唯一约束违反也只会在看似随机的时间发生。

问题:

1)我在分析更改以解决此唯一约束冲突方面是否正确?

2)将hibernate用作JPA提供程序时,使用序列生成器的最佳实践是什么?

大佬总结

以上是大佬教程为你收集整理的JPA 2 @SequenceGenerator @GeneratedValue产生唯一约束冲突全部内容,希望文章能够帮你解决JPA 2 @SequenceGenerator @GeneratedValue产生唯一约束冲突所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。