2015-03-30 2 views
-1

Использование MySQL и Hibernate 4.3.5Hibernate Дублировать запись исключение создает блокировку на строку в MySQL

У меня есть строка в таблице Mortgage с первичным ключом 091210. В приложении Java, использующем спящий режим, когда я (ошибочно) пытаюсь сохранить ипотеку с тем же ключом, регистрируется правильное исключение com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '091210' for key 'PRIMARY', не выбрано.

Проблема:

Это исключение выбрасывается/авторизовались пока программа не завершится выполнение ни прекращается. Кроме того, я заметил, что в исходной строке создается блокировка обновления/удаления, которая вызвала дублирующее исключение. Единственный способ восстановления - это, если я могу вручную завершить программу, а затем правильная строка больше не «заблокирована»

  • Ожидается ли, что кто-либо испытал это раньше?
  • Как это можно восстановить из программы Java?

Я надеялся, что такое исключение отменит/разорвет транзакцию, и тогда будет выбрано исключение. Но вместо этого, кажется, исключение только регистрируется, блокировка создается на БД, и процесс, кажется, просто повесить на transaction.commit() ...

Код:

System.out.println("Begin transaction"); 
session.beginTransaction(); 

System.out.println("Save mortgage"); 
session.save(mortgage); 
System.out.println("Commit transaction"); 
session.getTransaction().commit(); 

System.out.println("Close session"); 
session.close(); 
System.out.println("Close SessionFactory"); 
HibernateUtil.getSessionFactory().close(); 

Соответствующий выход я вижу:

Begin transaction 
Save mortgage 
Commit transaction 
Hibernate: insert into mortgage (address, last_name, inst_id, date, mortgage_num) values (?, ?, ?, ?, ?) 
Mar 30, 2015 7:59:54 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 

... Caused by: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '091210' for key 'PRIMARY'

Тогда программа просто висит, все еще работает с красным светом светящейся, а замок на БД.

Нет try-catch, без регистрации. Это с консоли Eclipse.

+0

Я предполагаю, что вы поймаете исключение, а затем запишите его в файл журнала. Когда вы его поймаете, выполняете ли вы откат транзакции спящего режима? Потому что это должно исправить замок. – Ractoc

+0

Мое приложение не занималось регистрацией и не было «try-catch». Я буду обновлять ответ с кодом, который я выполнил. – mmcrae

+0

Хорошо, я посмотрю еще немного завтра на работу, если найду запасные 15 минут или около того. – Ractoc

ответ

0

Позвольте мне здесь ответ, чтобы я мог правильно форматировать код ...

В своем коде, добавить немного обработки ошибок:

try { 
    System.out.println("Begin transaction"); 
    session.beginTransaction(); 

    System.out.println("Save mortgage"); 
    session.save(mortgage); 
    System.out.println("Commit transaction"); 
    session.getTransaction().commit(); 

    System.out.println("Close session"); 
    session.close(); 
    System.out.println("Close SessionFactory"); 
    HibernateUtil.getSessionFactory().close(); 
} catch (HibernateException he) { 
    he.printStackTrace(); 
} 

Это будет печатать весь StackTrace вам консоль. Есть более эффективные способы регистрации таких вещей, но это не будет хорошо. Когда вы попадаете в catch, вы также можете сделать хороший откат транзакции. Но такая очистка может произойти после того, как мы исправим вашу более непосредственную проблему.

В ближайшие несколько дней я буду готовить хороший учебник.

+0

, как упоминалось выше в Q, нет никаких исключений или каких-либо исключений. Вот почему это было так странно. Никакое исключение не выбрасывается/вылавливается. Программа просто повесилась.У меня не было никаких заявлений на уловки, поэтому все, что нужно бросить, должно было прекратить программу. И журналы из спящего режима появились не потому, что я делал какие-либо протоколирования, а потому, что Eclipse просто записывал собственный журнал в hibernate в окно консоли – mmcrae

Смежные вопросы