我编写的hql在Hql编辑器中正常工作,但是当我在java代码中应用它时,它会给我错误。
正常运行的HQL查询
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表的外键,可以为null。 否则其他东西,如添加,更新和删除工作正常。 我正在使用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)....
答案 0 :(得分:1)
问题不在于查询。问题是Hibernate需要在执行查询之前刷新会话(将其在内存中的更改保存到数据库中),以确保查询将这些更改考虑在内。
并且无法完成刷新,因为一些持久或修改的SecuredObject引用了一个瞬态(即尚未持久化)的实例。
正如消息所说,在完成刷新之前,必须保存(或保留)此瞬态实例。