【问题标题】:hibernate AssertionFailure from a grails project来自 grails 项目的休眠 AssertionFailure
【发布时间】:2011-05-21 01:03:56
【问题描述】:

我收到如下开头的错误。这与我的级联设置方式有关吗?开始调查的合适地点在哪里?现在我有一个具有许多 RoleDuty 的角色。 RoleDuty 属于角色。 RoleDuty 只有一个字段 duty,它是一个可为空的 String。 Role 具有 RoleDuties 列表的 all-delete-orphan 映射。

06.12.2010 10:02:17 *ERROR* AssertionFailure: an assertion failure occured (this may indicate a bug in Hibernate, but is
 more likely due to unsafe use of the session) (AssertionFailure.java, line 47)
org.hibernate.AssertionFailure: null id in RoleDuty entry (don't flush the Session after an exception occurs)
        at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:78)
        at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:187)
        at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:14
3)
        at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
        at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListen
er.java:99)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:49)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
        at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390)
        at org.codehaus.groovy.grails.orm.hibernate.support.GrailsOpenSessionInViewInterceptor.flushIfNecessary(GrailsOp
enSessionInViewInterceptor.java:116)
        at org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor.postHandle(OpenSessionInViewIntercept
or.java:181)
        at org.codehaus.groovy.grails.orm.hibernate.support.GrailsOpenSessionInViewInterceptor.postHandle(GrailsOpenSess
ionInViewInterceptor.java:66)
        at org.springframework.web.servlet.handler.WebRequestHandlerInterceptorAdapter.postHandle(WebRequestHandlerInter
ceptorAdapter.java:61)
        at org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet.doDispatch(GrailsDispatcherServlet.java:303)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

类定义:

class RoleDuty
{


  static belongsTo = [role:Role]

  static constraints = {
        duty(nullable: true)
  } 
    static mapping = {
          duty type:"text"
    }

  String duty;
  boolean _deleted
  static transients = ['_deleted']

  @XmlValue
  public String getDuty(){
    return duty;
  }


  String toString()
  {
      return duty;
  }

}


public class Role implements Comparable
{

    static belongsTo = [project:Project]
    static hasMany = [ roleDuties:RoleDuty]

    static mapping = {
        roleDuties cascade:"all-delete-orphan", lazy:false
    }

    List<RoleDuty> roleDuties = new ArrayList<RoleDuty>()


}

【问题讨论】:

标签: sql hibernate grails groovy


【解决方案1】:

Hibernate 的错误消息“发生异常后不刷新 Session”表明此 Session 上发生了与 Hibernate 相关的异常,但您的代码捕获了异常并继续使用 Session。 Hibernate 的 API 规定如果 Hibernate 抛出异常,你必须回滚事务/关闭 Session 并在新的 Session 中做任何你想做的事情。

仅从这个堆栈跟踪很难准确判断问题出在哪里,调试 Hibernate 错误需要反复试验。我建议您在调试代码的同时查找此异常之前的异常,并弄清楚如何避免它。

【讨论】:

    猜你喜欢
    • 2012-09-24
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2016-03-31
    • 1970-01-01
    相关资源
    最近更新 更多