我是在我的表中生成I的策略:
@Entity
@Table(name="HGCTRAMITES")
@Getter
@Setter
@SequenceGenerator(name="SEQ_HGCTRAMITES", sequenceName="SEQ_HGCTRAMITES")
@ToString
public class Tramite {我的列主键是这样的:
@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?
Hibernate:
select
seq_hgctramites.nextval
from
dual发布于 2018-06-06 02:00:34
原因可能是这样的:
此序列和此表已在使用其他应用程序
你能保证其他应用使用相同的序列SEQ_HGCTRAMITES来生成主键吗?与Hibernate生成主键的方式相同吗?
默认情况下,Hibernate将期望序列递增50,并使用从n-50到n的数字来填充ids,其中n是序列生成的最后一个值。
例如,如果您知道另一个应用程序希望序列递增1,并且只使用连续If的最后一个序列值,那么您应该使用@SequenceGenerator(..., incrementBy = 1)来模仿这种行为。为了摆脱当前的困境,你还需要转发序列,这样两个应用程序都不会尝试使用表中已经存在的id (你可以简单地从序列中选择nextval,直到它大于任何已经存在的id )。
如果这两个应用程序都使用JPA,那么保持incrementBy参数同步应该可以做到这一点(不过,关于转发序列的部分仍然有效)。
https://stackoverflow.com/questions/50698741
复制相似问题