Hibernate выдает ошибку нарушения ПК - PullRequest
4 голосов
/ 27 марта 2012

Я использовал hibernate с jboss 4.2.3, и все работало, теперь я перенес код на Jboss 7.1.1, и внезапно я начинаю получать:

Caused by: org.hibernate.exception.ConstraintViolationException: ORA-00001: unique constraint (OBLICORE.PK_ACE_WORKERS_QUEUE_STATS_ID) violated

Также сгенерированные идентификаторы отрицательны.

Сущность, которая терпит неудачу, определяется следующим образом:

@Id
@SequenceGenerator(name = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", sequenceName = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", allocationSize = 500)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ACE_WORKERS_QUEUE_STATS_ID")
@Column(name = "ID")
private long Id;

Я проверил последовательность в Oracle, и она кажется O.K (как я уже сказал, она работала раньше с jboss 4.2 и ничего не изменилось на стороне БД с момента миграции).

Я попытался написать журналы запросов Hibernate, но не смог найти этот запрос, и я также зарегистрировал конкретный вызов, сохраняющий этот класс, и увидел, что он вызывается только один раз.

Ответы [ 3 ]

8 голосов
/ 27 марта 2012

Проверьте этот вопрос: последовательность оракула гибернации дает большой разрыв

Это должен быть генератор последовательностей Hibernate, который по умолчанию настроен на алгоритм Hi / Lo, а возвращаемые значения переполнены. Вы можете попробовать использовать аннотацию, специфичную для спящего режима, по умолчанию для более старого поведения GenericGenerator(name="blah", strategy="sequence") или установить allocationSize=1.

Если вы полагаетесь на увеличение вашей последовательности на какое-то значение, большее 1, вам придется использовать другой генератор. Или, может быть, достаточно установить hibernate.id.new_generator_mappings на false, но это входит в рамки нового вопроса.

1 голос
/ 10 января 2014

Когда мы изменили Hibernate, чтобы использовать новый генератор, я использовал следующий скрипт для исправления последовательностей:

  DECLARE
    v NUMBER;
  BEGIN
    FOR r IN (select sequence_name from user_sequences) LOOP
      EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| r.sequence_name ||' INCREMENT BY 50';
      EXECUTE IMMEDIATE 'SELECT '|| r.sequence_name ||' .NEXTVAL FROM DUAL' INTO v;
    END LOOP;
  END;
  /

Если ваш allocSize равен 500, вы должны изменить «INCREMENT BY 50» на «INCREMENT»BY 500 ".

0 голосов
/ 27 марта 2012

Если сгенерированное значение id не столь критично в вашем проекте, попробуйте использовать @GeneratedValue(strategy = GenerationType.AUTO), эта стратегия автоматически сгенерирует id, увеличивая его на единицу.Надеюсь, это будет полезно для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...