Hibernate - Пакетное обновление вернуло неожиданное количество строк из обновления: 0 фактическое количество строк: 0 ожидается: 1 - PullRequest
119 голосов
/ 30 апреля 2010

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

org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
        at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:93)
        at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:79)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransacti
onManager.java:500)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManag
er.java:473)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(Transaction
AspectSupport.java:267)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)

Ответы [ 30 ]

0 голосов
/ 16 июля 2018

Я получил то же сообщение. После поиска исходного кода, связанного с кодом, мне пришло в голову, что запуск приложения на локальной машине мешает этапу разработки, потому что общий ресурс совпадает с БД. Поэтому иногда один сервер уже удалил запись, а другой просто хотел сделать то же самое.

0 голосов
/ 16 января 2018

Это происходит со мной, потому что мне не хватает объявления идентификатора в классе бина.

0 голосов
/ 02 февраля 2018

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

0 голосов
/ 11 августа 2016

Hibernate кэширует объекты из сеанса. Если объект доступен и изменен более чем одним пользователем, может быть выброшено org.hibernate.StaleStateException. Это может быть решено с помощью метода слияния / обновления объекта перед сохранением или использованием блокировки. Дополнительная информация: http://java -fp.blogspot.lt / 2011/09 / orghibernatestalestateexception-batch.html

0 голосов
/ 21 августа 2016

После прочтения всех ответов не нашлось никого, кто бы мог поговорить об обратном атрибуте hibernate.

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

Предположим, у нас есть две таблицы:

основной_таблицы , middle_table

с отношением один ко многим . Классы отображения спящего режима: Основной и Средний соответственно.

Таким образом, класс Principal имеет SET Middle объектов. Файл сопоставления xml должен выглядеть следующим образом:

<hibernate-mapping>
    <class name="path.to.class.Principal" table="principal_table" ...>
    ...
    <set name="middleObjects" table="middle_table" inverse="true" fetch="select">
        <key>
            <column name="PRINCIPAL_ID" not-null="true" />
        </key>
        <one-to-many class="path.to.class.Middel" />
    </set>
    ...

Поскольку для параметра инверсии задано значение «истина», это означает, что «средний» класс является владельцем отношения, поэтому основной класс будет НЕ ОБНОВЛЯТЬ отношение.

Таким образом, процедура обновления может быть реализована так:

session.beginTransaction();

Principal principal = new Principal();
principal.setSomething("1");
principal.setSomethingElse("2");


Middle middleObject = new Middle();
middleObject.setSomething("1");

middleObject.setPrincipal(principal);
principal.getMiddleObjects().add(middleObject);

session.saveOrUpdate(principal);
session.saveOrUpdate(middleObject); // NOTICE: you will need to save it manually

session.getTransaction().commit();

Это сработало для меня, но вы можете предложить несколько выпусков для улучшения решения. Таким образом, мы все будем учиться.

0 голосов
/ 03 марта 2017

Я столкнулся с этим исключением, и спящий режим работал хорошо.Я попытался вручную вставить одну запись с помощью pgAdmin, здесь проблема стала ясной.Запрос SQL вставки возвращает 0 вставки.и есть триггерная функция, которая вызывает эту проблему, потому что она возвращает ноль.поэтому я должен только установить его, чтобы вернуть новый.и наконец я решил проблему.

надеюсь, что это поможет любому телу.

0 голосов
/ 28 ноября 2016

Я получил эту ошибку, потому что я по ошибке сопоставил столбец ID, используя Id(x => x.Id, "id").GeneratedBy.**Assigned**();

Проблема устранена с помощью Id(x => x.Id, "id").GeneratedBy.**Identity**();

0 голосов
/ 12 сентября 2016

один корпус

SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session session=sf.openSession();

UserDetails user=new UserDetails();

session.beginTransaction();
user.setUserName("update user agian");
user.setUserId(12);
session.saveOrUpdate(user);
session.getTransaction().commit();
System.out.println("user::"+user.getUserName());

sf.close();
0 голосов
/ 16 января 2019

Несколько способов отладки этой ошибки:

  1. Как предложено в принятом ответе - включите шоу sql.
  2. Я обнаружил, что существует некоторая проблема с настройкой идентификатора в hibernate sql.
  3. Обнаружено, что мне не хватает @GeneratedValue (стратегии = GenerationType.IDENTITY)
0 голосов
/ 22 июня 2016

Это произошло, если вы изменили что-то в наборе данных, используя собственный SQL-запрос, но сохраненный объект для того же набора данных присутствует в кэше сеанса. Используйте session.evict (yourObject);

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