首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用oracle序列和hibernate的ORA-00001

使用oracle序列和hibernate的ORA-00001
EN

Stack Overflow用户
提问于 2018-06-05 19:16:19
回答 1查看 277关注 0票数 0

我是在我的表中生成I的策略:

代码语言:javascript
复制
@Entity
@Table(name="HGCTRAMITES")
@Getter
@Setter
@SequenceGenerator(name="SEQ_HGCTRAMITES", sequenceName="SEQ_HGCTRAMITES")
@ToString
public class Tramite {

我的列主键是这样的:

代码语言:javascript
复制
@Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_HGCTRAMITES")
    private Integer codigo;

此序列和此表已在使用其他应用程序,此表已有数据。

我正在使用Oracle11g,我的方言hibernate:它是spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect

在日志控制台中,hibernate调用查询next sequence,但我收到错误: ORA-00001: restrição exclusiva (HELPDESK.PK_HGCTRAMITES) violada。

我的表只有codigo列作为主键。

为什么hibernate要搜索它已经存在的id?

代码语言:javascript
复制
Hibernate: 
    select
        seq_hgctramites.nextval 
    from
        dual
EN

回答 1

Stack Overflow用户

发布于 2018-06-06 02:00:34

原因可能是这样的:

此序列和此表已在使用其他应用程序

你能保证其他应用使用相同的序列SEQ_HGCTRAMITES来生成主键吗?与Hibernate生成主键的方式相同吗?

默认情况下,Hibernate将期望序列递增50,并使用从n-50n的数字来填充ids,其中n是序列生成的最后一个值。

例如,如果您知道另一个应用程序希望序列递增1,并且只使用连续If的最后一个序列值,那么您应该使用@SequenceGenerator(..., incrementBy = 1)来模仿这种行为。为了摆脱当前的困境,你还需要转发序列,这样两个应用程序都不会尝试使用表中已经存在的id (你可以简单地从序列中选择nextval,直到它大于任何已经存在的id )。

如果这两个应用程序都使用JPA,那么保持incrementBy参数同步应该可以做到这一点(不过,关于转发序列的部分仍然有效)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50698741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档