Mul*_*ard 0 spring hibernate jpa spring-boot
我有一个Spring Boot应用程序,该应用程序已经在线运行了几个月,直到今天没有任何问题。我有一个ID生成类型序列为Entity的实体:
@Entity
@ComponentScan
public class MyEntity {
/**
*
*/
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
}
Run Code Online (Sandbox Code Playgroud)
从今天开始,在创建和存储新实体时出现错误:
Unique index or primary key violation: "PRIMARY_KEY_D92 ON PUBLIC.MyEntity(ID) VALUES (3713, 250)"; SQL statement:
Run Code Online (Sandbox Code Playgroud)
每次发生此错误时,数据库中已经存在生成的ID(在这种情况下为3713)。那么,为什么突然间GenerationType.SEQUENCE生成了已经存在的ID?
编辑
我使用H2数据库版本1.4.191
我在Hibernate中遇到了这个问题,但是我们有明确的@SequenceGenerator注释。问题是JPA中的默认SequenceGenerator的allocationSize值为50,其中默认数据库序列的增量为1。这两个值必须相同。一种解决方案是定义您的SequenceGenerator并显式设置那个distributionSize。
@SequenceGenerator(name = "my_entity_gen", sequenceName = "my_entity_id_seq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_entity_gen")
Run Code Online (Sandbox Code Playgroud)
生成器必须唯一,除非您希望两个表共享它们。
另一种解决方案是使用不同的生成策略。
@GeneratedValue(strategy = GenerationType.IDENTITY)
Run Code Online (Sandbox Code Playgroud)
如果数据库在插入时已经知道要查询序列(通常这样做),则该方法将起作用,除非您已在表后显式创建了序列。
第一种方法将为每个插入触发两次对数据库的查询,因此几乎可以肯定效率较低。
| 归档时间: |
|
| 查看次数: |
4133 次 |
| 最近记录: |