java - 查询已查询的域对象时,Grails GORM会给出 hibernate 异常

标签 java hibernate grails

我有一个Grails应用, Controller 在其中调用交易服务。该服务具有以下内容

def rep = Rep.findById(2708280)

def r = Rep.findById(2708280)
r.accountNumber = "123423565476"
r.save(failOnError: true)

def list = Rep.findAllByRtnAndAccountNumber(
        rep.rtn, rep.accountNumber)

当调用方法的最后一行时,我得到了以下休眠异常:
    ERROR an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session) [AssertionFailure]
org.hibernate.AssertionFailure: collection [com.mydomain.InnerObject.assignedTests] was not processed by flush()
at org.hibernate.engine.CollectionEntry.postFlush(CollectionEntry.java:228)
at org.hibernate.event.def.AbstractFlushingEventListener.postFlush(AbstractFlushingEventListener.java:352)
at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:65)
at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:1185)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1709)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
at org.codehaus.groovy.grails.orm.hibernate.metaclass.FindAllByPersistentMethod$1.doInHibernate(FindAllByPersistentMethod.java:113)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
at org.springframework.orm.hibernate3.HibernateTemplate.executeFind(HibernateTemplate.java:348)
at org.codehaus.groovy.grails.orm.hibernate.metaclass.FindAllByPersistentMethod.doInvokeInternalWithExpressions(FindAllByPersistentMethod.java:73)
at org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractClausedStaticPersistentMethod.doInvokeInternal(AbstractClausedStaticPersistentMethod.java:543)
at org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractClausedStaticPersistentMethod.doInvokeInternal(AbstractClausedStaticPersistentMethod.java:417)
at org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractStaticPersistentMethod.invoke(AbstractStaticPersistentMethod.java:79)
at org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractStaticPersistentMethod.invoke(AbstractStaticPersistentMethod.java:72)
at sun.reflect.GeneratedMethodAccessor9819.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:233)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:58)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:141)
at org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2.doCall(GormStaticApi.groovy:102)
at org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2.call(GormStaticApi.groovy)
at org.codehaus.groovy.runtime.metaclass.ClosureStaticMetaMethod.invoke(ClosureStaticMetaMethod.java:62)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:46)
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:91)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at com.mydomaint.MyService.$tt__process(MyService.groovy:118)

其中“com.mydomain.InnerObject”是我上面的域对象的内部对象。
static belongsTo = [owner: InnerObject]

InnerObject owner

而namedTests是InnerObject域的一个属性:
static hasMany = [assignedVouchers: AssignedTests]

我在这里想念什么吗?此异常是什么意思?

最佳答案

发生这种情况可能是因为您在 session 中有两个具有相同实例的对象,但它们的值不同。
rep未被修改,并且r被修改(并持久化)

当您调用list时,Hibernate尝试刷新 session ,但会感到困惑

at org.hibernate.engine.CollectionEntry.postFlush(CollectionEntry.java:228)
at org.hibernate.event.def.AbstractFlushingEventListener.postFlush(AbstractFlushingEventListener.java:352)
at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:65)
at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:1185)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1709)

相反,您可以尝试将传递给列表的参数保存在单独的变量中。试试看:
def r = Rep.findById(2708280)
def p1 = r.rtn
def p2 = r.accountNumber

r.accountNumber = "123423565476"
r.save(failOnError: true)

def list = Rep.findAllByRtnAndAccountNumber(p1, p2)

关于java - 查询已查询的域对象时,Grails GORM会给出 hibernate 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35506261/

相关文章:

java - JPA @OneToMany 具有 1 - 1..* 关系

java - 如何使用 Eclipse、Maven、Grails 和 git 建立新的 Java 项目?

java - 在 Android 中调用电话

java - Java 中的继承

java - 无法获取 JdbcConnectionException : The BUFFERDIR connection property is invalid

eclipse - 带有Groovy编译器2.4.12的Eclipse中的Grails 2.5.5引发Refresh Dependencies错误

grails - 从 bootstrap 调用 grails Controller ?

java - android/java - 解析不同结构的 JSON 响应

java - 使用 GROUP BY 和 RETURN ENTITY LIST 的 Hibernate 标准

java - 优缺点 : Hibernate vs. EJB 3