Hibernate вызывает сброс при обнаружении - вызывает ненулевую ошибку - PullRequest
3 голосов
/ 22 мая 2009

У меня есть процесс, который обновляет дерево в базе данных, и при этом выполняет операции чтения для проверки дубликатов сущностей.

Я обнаружил, что попытка выполнить crit.uniqueResult () в середине этого процесса вызывает следующую ошибку:

org.hibernate.PropertyValueException: свойство not-null ссылается на ноль или переходное значение

Просматривая трассировку стека, я вижу, что uniqueResult () сбрасывает сессию, пытаясь выполнить обновления, которые еще не готовы для доступа к базе данных.

at org.hibernate.engine.Cascade.cascade(Cascade.java:153)
at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154)
at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:145)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:58)
at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:996)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1589)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
at org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:328)
at com.inversion.dal.BaseDAO.findUniqueByCriterion(BaseDAO.java:59)

Я что-то здесь неправильно настроил?

Любая помощь с благодарностью.

Marty

Ответы [ 3 ]

3 голосов
/ 22 мая 2009

Hibernate запоминает объекты должны быть сохранены. при выдаче выбора hibernate сбрасывает эти изменения. это гарантирует, что выбор вернет правильные результаты.

установка flushmode для чего-либо другого, кроме FlushMode.AUTO предотвратит это поведение. Но ошибка в вашем коде, когда вы передаете неполный объект в спящий режим для сохранения или обновления. Поэтому правильное решение - передать объект позже в спящий режим, когда он будет завершен.

2 голосов
/ 22 мая 2009

Отключите автоматическую очистку объекта Session, чтобы исправить это исключение.

Session s;
// if you're doing transactional work
s.setFlushMode(FlushMode.COMMIT);
// if you want to control flushes directly
s.setFlushMode(FlushMode.MANUAL);

Однако это не ваша ошибка. Что-то ранее в вашем коде приводит к тому, что объекты в памяти находятся в недопустимом состоянии, которое пытается быть сохранено в БД во время автоматической очистки.

0 голосов
/ 31 мая 2012

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

Если вы близки к остроумию, вы также можете выполнить вспомогательные запросы, такие как findAll, в новом сеансе:

Domain.withNewSession { session -> ... }

Это обычно обходило меня в большинстве случаев.

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