2015-12-24 3 views
1

Я новичок в Hibernate. Теперь работаем над примером из Интернета. У меня есть база данных MySQL, которая содержит некоторые таблицы, включая таблицу «профессия». Эта таблица имеет два столбца: profession_id (auto-increment) и имя профессии.Java. Hibernate. org.hibernate.StaleStateException: пакетное обновление возвращало неожиданный счетчик строк из обновления [0]; фактическое количество строк: 0; Ожидается: 1

В проекте java У меня есть класс «Test», который содержит несколько методов обработки таблиц и «основной» метод. методы обработки являются:

private void addProfession(String name) { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    Profession r = new Profession(); 
    r.setProfessionName(name); 
    session.save(r); 
    session.getTransaction().commit(); 
} 

private ArrayList<Profession> getProfessions() { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    ArrayList<Profession> result = (ArrayList<Profession>) session 
      .createQuery("from Profession order by professionName").list(); 
    session.getTransaction().commit(); 
    return result; 
} 

private void deleteProfessions(ArrayList<Profession> result) { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    for (Profession p : result) { 
     System.out.println("Delete: " + p.getProfessionId() + ": " + p.getProfessionName()); 
     session.delete(p); 
    } 
    session.getTransaction().commit(); 
} 

private void deleteEntity(Object object){ 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    session.delete(object); 
    session.flush(); 

    session.getTransaction().commit(); 

} 

'главный' метод содержит следующие операции:

public static void main(String[] args) { 
    Test test = new Test(); 
    test.addProfession("Profession_1"); 
    test.addProfession("Profession_2"); 
    test.addProfession("Profession_3"); 
    test.addProfession("Profession_4"); 
    test.addProfession("Profession_5"); 

    ArrayList<Profession> result = test.getProfessions(); 

    test.deleteEntity(result.get(0)); 
    test.deleteProfessions(result); 
} 

Итак, проблемы: когда я запускаю его я получаю

Exception in thread "main" org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:67) 
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:54) 
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:46) 
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3197) 
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3434) 
at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:98) 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560) 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434) 
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337) 
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) 
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1282) 
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:465) 
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2963) 
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2339) 
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485) 
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147) 
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38) 
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231) 
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65) 
at firstproject.Main.deleteProfessions(Main.java:33) 
at firstproject.Main.main(Main.java:57) 

После прочтения нескольких тем об этой теме в stackoverflow я узнал, что эта проблема как-то связана с идентификаторами. Поэтому я решил прокомментировать этот код:

test.deleteEntity(result.get(0)); 

После этого все работало нормально.

Так что вопрос: Как избежать этого исключения, если мне нужно: 1. Удалите один из рядов ('потому что эта проблема возникает при удалении, например, result.get (3) и так далее) , 2. Удалите оставшиеся строки.

ответ

2

После удаления определенного Profession также удалите это с ArrayList. Например

test.deleteEntity(result.get(0)); 
    result.remove(0); 

Это должно решить вашу проблему.

+0

Позор на меня! :) Большое вам спасибо. Обновление: второй способ (который я не заметил в примере) - обновить список результатов, добавив этот 'result = test.getProfessions();' после 'test.deleteEntity (result.get (0)); ' – Kleeo

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

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