有2个应用程序:一个是使用Spring boot - 1.5.18.Release版本,其休眠版本为5.0.12.Final
另一个应用程序正在使用 Spring boot - 2.4.1 版本,其休眠版本为5.4.25.Final:https://search.maven.org/artifact/org.springframework.boot/spring-boot-dependencies/2.4.1 /pom 我们使用了@SequenceGenerator(name = "sequenceGenerator", sequenceName = "ABCD_SEQ",allocationSize = 1),
分配大小是必需的,因为应用程序没有启动
而第一次申请时不需要分配大小。
数据库序列是使用“INCREMENT BY 1”创建的,并且两个应用程序都使用相同的 oracle 数据库。
这两个应用程序使用了许多类似的实体,这些实体被复制到另一个应用程序/项目中。
但是当从 spring-boot 为 2.4.1 的第二个应用程序插入记录时,我们遇到了独特的序列生成器问题。
分析时,我们发现第一个应用程序(1.5.18.Release)突然增加序列,尽管它应该增加 1,在两者之间留下很多间隙,有时是 50、100 等,当第二个应用程序( 2.4.1) 尝试插入记录,出现唯一约束错误。
请帮忙,究竟在哪里搜索根本原因,或者这种情况下如何使用休眠缓存机制?
第一个应用程序中的一个实体(1.5.18.Release)
@Entity
@Table(name = "MERCURY_INSTANCE")
public class MercuryInstance implements Serializable {
@Id
@Column(name = "MERCURY_INSTANCE_KEY", nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqGen")
@SequenceGenerator(name = "seqGen", sequenceName = "MERCURY_INSTANCE_SEQ")
private Long mercuryInstanceKey;
@ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
@JoinColumn(name = "MERCURY_KEY", referencedColumnName = "MERCURY_KEY", nullable = false)
private MERCURY mercury;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "MERCURY_INSTANCE_KEY", referencedColumnName = "MERCURY_INSTANCE_KEY", nullable = false)
private MercuryInstanceTechParams MercuryInstanceTechParams;
@ManyToMany(mappedBy = "mercuryGroupInstances")
private List<MercuryGroupInstance> MercuryGroupInstances;
@Column(name = "CREATED_DATE")
private Timestamp createdDte;
@Column(name = "CREATED_BY")
private String createdBy;
@Column(name = "UPDATED_DATE")
private Timestamp updatedDte;
@Column(name = "UPDATED_BY")
private String updatedBy;
/* getter and setters of above fields */
}
虽然另一个应用程序(2.4.1)是相似的,但唯一的区别是序列生成器,例如:
@Id
@Column(name = "MERCURY_INSTANCE_KEY", nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqGen")
@SequenceGenerator(name = "seqGen", sequenceName = "MERCURY_INSTANCE_SEQ", allocationSize = 1)
private Long mercuryInstanceKey;
并且数据库序列是:
CREATE SEQUENCE "MERCURY_INSTANCE_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 55 NOCACHE NOORDER NOCYCLE ;