Получение данных с нулевым столбцом в спящем режиме - PullRequest
2 голосов
/ 13 января 2012

Я написал hql, который корректно работает в редакторе Hql, но когда я применяю его в java-коде, это выдает ошибку.

HQL Query, который работает правильно

select auhority.id  from Authority as auhority where auhority.action = 'USER_MASTER_FULL_ACCESS' and auhority.aclObject is NULL

Java-код для выполнения запроса

String hql = "from " + Authority.class.getCanonicalName() + " as model where model."  +     Authority.ACTION + " = ? and model." + Authority.ACL_OBJECT + " is null";
Query query = getSession().createQuery(hql);
query.setParameter(0, action);
List<Authority> list = query.list();
return list;

Здесь SecuredObject - это ACL_OBJECT, который является внешним ключом для таблицы Authority, которая может быть нулевой. В противном случае другие вещи, например, добавить, обновить и удалить работает правильно. Я использую MsSqlserver 2005 для базы данных.

Это дает мне ошибку, как следует

org.hibernate.TransientObjectException: object references an unsaved transientinstance - save the transient instance before flushing: com.xxxxx.xxxx.xxxx.SecuredObject
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:456)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:265)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:275)
at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:295)
at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:3403)
at org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:520)
at org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:230)....

1 Ответ

1 голос
/ 13 января 2012

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

И сброс не может быть выполнен, потому что некоторые сохраненные или измененные SecuredObject ссылаются на временный (т.е. еще не сохраненный) экземпляр.

Как говорится в сообщении, этот временный экземпляр должен быть сохранен (или сохранен) до завершения сброса.

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