ORA-00001 с использованием последовательностей оракула и гибернации - PullRequest
0 голосов
/ 05 июня 2018

Я являюсь этой стратегией генерации идентификаторов в моей таблице:

@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;

Эта последовательность и эта таблица уже естьиспользуйте приложение perother, в этой таблице уже есть данные.

Я использую Oracle 11g, мой диалект спящий: это spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect

В консоли журнала вызов гибернации вызывает запрос следующей последовательности,но я получаю сообщение об ошибке: ORA-00001: restrição exclusiva (HELPDESK.PK_HGCTRAMITES) violada.

В моей таблице есть только столбцы codigo для первичного ключа.

Почему hibernate ищет идентификатор, которыйэто уже существует?

Hibernate: 
    select
        seq_hgctramites.nextval 
    from
        dual

1 Ответ

0 голосов
/ 05 июня 2018

Причина, вероятно, заключается в следующем:

Эта последовательность и эта таблица уже используется приложением perother

У вас есть гарантия, что другое приложение использует ту же последовательностьSEQ_HGCTRAMITES для генерации первичных ключей, так же, как в Hibernate ?

По умолчанию Hibernate ожидает увеличения последовательности на 50 и использует числа от n-50 до n для заполнения идентификаторов, где n - последнее значение, сгенерированное последовательностью.

Если, например, вы знаете, что другое приложение ожидает увеличения последовательности на 1, и просто использует последнее значение последовательности для последовательных идентификаторов, вы должны использовать @SequenceGenerator(..., incrementBy = 1) для имитации этого поведения.Чтобы выйти из текущего затруднительного положения, вам также потребуется переслать последовательность, чтобы ни одно из приложений не пыталось использовать идентификатор, который уже присутствует в таблице (вы можете просто продолжать выбирать nextval из последовательности, пока она не станет больше, чем любая другая).идентификатор уже присутствует).

Если оба приложения используют JPA, то синхронизация параметра incrementBy должна помочь (хотя часть о пересылке последовательности остается в силе).

...