Будьте в спящем режиме ограничение ConstraintViolationException. Существует ли простой способ проигнорировать дублирующиеся записи?

PHP будет работать только с расширением файла .php.

Если вы находитесь в Apache, вы также можете установить в своем httpd.conf файле расширения для PHP. Вам нужно найти строку:

AddType application/x-httpd-php .php .html
                                     ^^^^^

и добавить количество расширений, которые должны быть прочитаны с помощью интерпретатора PHP, как вы хотите.

18
задан luxerama 23 May 2010 в 23:35
поделиться

5 ответов

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

Как Hibernate мог знать, что запись имеет неуникальное значение без фактической вставки записи?

Если вы выполняете пакетную вставку и не хотите откатить всю транзакцию и отменить сеанс в случае ConstraintViolationException (это то, что вы должны делать в теории после исключения, см. это нить и этот предыдущий ответ ), я бы предложил использовать API StatelessSession и поймать ConstraintViolationException.

14
ответ дан 30 November 2019 в 08:10
поделиться

, даже если вы поймаете исключение, могут быть другие проблемы

try{
       session.save(O);
       session.getTransaction().commit();
    }catch (HibernateException e) {
       System.out.println("you are carched ¤#%SD¤") ;
    }
-1
ответ дан 30 November 2019 в 08:10
поделиться

Как и сказал Паскаль, Hibernate не узнает, является ли это дубликатом, пока он не будет фактически введен.

Я уже сталкивался с подобной ситуацией раньше; несколько потоков выполняли вставки в БД, но некоторые из них могли быть дубликатами. Все, что я сделал, - это поймал и аккуратно восстановился, когда было выброшено одно из этих исключений.

1
ответ дан 30 November 2019 в 08:10
поделиться

Hibernate не может этого сделать. Однако вы можете сделать это сами. По сути, есть два варианта:

  1. Проверить наличие дубликатов перед вставкой; или
  2. Перехватите ConstraintViolationException, а затем убедитесь, что нарушение вызвано дубликатом (поскольку могут быть другие причины, например, пустые поля).

Первый имеет тот недостаток, что вы проверяете дубликаты на каждой вставке, когда вероятность того, что дубликат действительно существует, может быть низкой. Последний будет быстрее в обычном случае, когда дубликаты не возникают, но имеет тот недостаток, что вам нужно проверять дубликаты после лица. Когда генерируется ConstraintViolationException, он делает недействительным текущий сеанс; это означает, что вам нужно будет выполнить промывку перед поиском дубликата.

Проверка дубликатов перед вставкой, вероятно, является самым чистым подходом, если нет серьезной проблемы с производительностью, о которой вам нужно беспокоиться. Убедитесь, что вы выполняете поиск и вставляете транзакцию, чтобы гарантировать, что кто-то не добавит дубликат между поиском и вставкой, иначе вы получите ConstraintViolationException.

11
ответ дан 30 November 2019 в 08:10
поделиться

Вместо использования createQuery () в спящем режиме используйте createSQLQuery () и попробуйте запрос типа «REPLACE INTO method (id) VALUES (123);»

1
ответ дан 30 November 2019 в 08:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: