org.hibernate.AssertionFailure:入口中的空id(在异常发生后不刷新会话) [英] org.hibernate.AssertionFailure: null id in entry (don't flush the Session after an exception occurs)

查看:109
本文介绍了org.hibernate.AssertionFailure:入口中的空id(在异常发生后不刷新会话)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个hibernate和JSF2应用程序进入部署服务器,并突然抛出异常中的org.hibernate.AssertionFailure:null id。我将立即提供堆栈跟踪和代码,但首先有四个重要问题:


  1. 这只发生在部署服务器上在Windows Sever 2008上运行的Jboss& MySql)。它在我的开发机器上运行(在Windoes 7 Pro上运行的Tomcat和MySql)并且不在登台环境上运行(在Linux上运行的Jboss和MySql)。


  2. 研究此问题,似乎人们在尝试插入对象时会出现此错误。但是当我做一个简单的查询时,我收到了错误。 (各种不同的查询,实际上,随着错误随机弹出几页)。

  3. 错误只会偶尔发生。如果我做了一个Jboss重启,它会消失,但一段时间后返回。此外,它不一致,有些点击就是在那里,有些则不是。即使它击中,当我做一个简单的页面刷新,它返回罚款。


  4. 我使用c3p0(config下)

  5. b

    有什么想法发生了什么?



    代码详情:

    这发生在一个地址对象上。以下是完整的hbm:

     <?xml version =1.0?> 
    <!DOCTYPE hibernate-mapping PUBLIC
    - // Hibernate / Hibernate映射DTD 3.0 // EN
    http://hibernate.sourceforge.net/hibernate-mapping-3.0 .dtd>
    < hibernate-mapping package =com.idex.auctions.model>
    < class name =Addresstable =addresslazy =true>
    < id name =addressIDcolumn =AddressID>
    < generator class =native/>
    < / id>

    < property name =citycolumn =city/>
    < property name =zipcolumn =zip/>
    < property name =statecolumn =state/>
    < property name =regioncolumn =region/>
    < property name =countrycolumn =country/>

    <多对一名称=用户
    class =com.idex.auctions.model.User
    column =userid
    unique =true
    cascade =save-update/>
    < / class>
    < / hibernate-mapping>

    Java类很简单:

      public class Address implements Serializable {
    private static final long serialVersionUID = 7485582614444496906L;

    私人长地址ID;
    私人字符串街道;
    私人字符串城市;
    私人字符串zip;
    私有字符串状态;
    私有字符串区域;
    私人字符串国家;
    私人用户用户;

    public address(){

    }
    public long getAddressID(){
    return addressID;
    }
    public void setAddressID(long addressID){
    this.addressID = addressID;
    }
    public String getStreet(){
    return street;
    }
    public void setStreet(String street){
    this.street = street;
    }
    public String getCity(){
    return city;
    }
    public void setCity(String city){
    this.city = city;
    }
    public String getZip(){
    return zip;
    }
    public void setZip(String zip){
    this.zip = zip;
    }
    public String getState(){
    return state;
    }
    public void setState(String state){
    this.state = state;
    }
    public String getRegion(){
    return region;
    }
    public void setRegion(String region){
    this.region = region;
    }
    public String getCountry(){
    return country;
    }
    public void setCountry(String country){
    this.country = country;
    }
    public User getUser(){
    return user;
    }
    public void setUser(User user){
    this.user = user;
    }

    }

    c3p0配置:

     < property name =hibernate.c3p0.acquire_increment> 1< / property> 
    < property name =hibernate.c3p0.idle_test_period> 1000< / property>
    < property name =hibernate.c3p0.max_size> 20< / property>
    < property name =hibernate.c3p0.min_size> 5< / property>
    < property name =hibernate.c3p0.timeout> 1800< / property>
    < property name =hibernate.c3p0.max_statements> 0< / property>
    < property name =connection.provider_class> org.hibernate.connection.C3P0ConnectionProvider< / property>

    使用的版本是

      hibernate3.jar 

    c3p0-0.9.1.2.jar

    myfaces-api-2.1.4.jar

    myfaces-impl-2.1.4.jar

    mysql-connector-java-5.1.20-bin.jar

    完整的堆栈跟踪

      org.hibernate.AssertionFailure:com.idex.auctions中的空id .model.Address入口
    (发生异常后不刷新会话)
    org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(
    DefaultFlushEntityEventListener.java:78)
    org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(
    DefaultFlushEntityEventListener.java:187)
    org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(
    DefaultFlushEntityEventListener.java:143)
    org.hibernate.event.def.AbstractFlushingEven tListener.flushEntities(
    AbstractFlushingEventListener.java:219)
    org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(
    AbstractFlushingEventListener.java:99)
    org.hibernate.event。 def.DefaultAutoFlushEventListener.onAutoFlush(
    DefaultAutoFlushEventListener.java:58)
    org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:997)
    org.hibernate.impl.SessionImpl.list( SessionImpl.java:1142)
    org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
    com.idex.auctions.manager.DatabaseManager.getAllObjects(DatabaseManager.java:464)
    com.idex.auctions.ui.NavBean.gotoHome(NavBean.java:40)
    sun.reflect.GeneratedMethodAccessor350.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(未知源)
    javax.el.BeanE LResolver.invokeMethod(BeanELResolver.java:735)
    javax.el.BeanELResolver.invoke(BeanELResolver.java:467)
    javax.el.CompositeELResolver.invoke(CompositeELResolver.java:246)
    org.apache.el.parser.AstValue.getValue(AstValue.java:159)
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
    org.apache.myfaces.view。 facelets.el.ContextAwareTagValueExpression.getValue(
    ContextAwareTagValueExpression.java:96)
    javax.faces.component._DeltaStateHelper.eval(_DeltaStateHelper.java:246)
    javax.faces.component.UIOutcomeTarget。 getOutcome(UIOutcomeTarget.java:50)
    org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils.getOutcomeTargetHref(
    HtmlRendererUtils.java:1542)
    org.apache.myfaces.shared。 renderkit.html.HtmlLinkRendererBase.renderOutcomeLinkStart(
    HtmlLinkRendererBase.java:908)
    org.apache.myface s.shared.renderkit.html.HtmlLinkRendererBase.encodeBegin(
    HtmlLinkRendererBase.java:143)
    javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:502)
    javax.faces。 component.UIComponent.encodeAll(UIComponent.java:744)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:758)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java: 758)
    org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(
    FaceletViewDeclarationLanguage.java:1900)
    org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java: 285)
    com.ocpsoft.pretty.faces.application.PrettyViewHandler.renderView(
    PrettyViewHandler.java:163)
    javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59)
    org.apache.myfaces.tomahawk.application.ResourceViewHandlerWrapper.renderView(
    ResourceViewHandlerWrapper.java:93)
    com.idex.auctions.ui.CustomViewHandler.renderView(CustomViewHandler.java:98)
    org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:115)
    org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:199)
    com.ocpsoft。 pretty.PrettyFilter.doFilter(PrettyFilter.java:126)
    com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:118)


    解决方案

    例外:


    org.hibernate。 AssertionFailure:入口中的空id(发生异常后不刷新会话)


    告诉我们会话异常已经发生之前引发 org.hibernate.AssertionFailure 的点。



    成为确切地说, org.hib当 session.flush()发生时,会引发ernate.AssertionFailure ,而不是发生错误的地方。



    以上是一个事实,因此可能的结论是:有些东西可能会压制原始异常。



    <因此,请查找其他可能的错误点:A save() saveOrUpdate()可能是试图使用 null 字段持久实体,其中表中的列是 NOT NULL






    提示:在每次与 Session 对象进行交互之后,尝试添加 session.flush() session.save(obj) session.merge(obj)等),这将有希望导致 org.hibernate.AssertionFailure 发生的更早,更接近发生真正问题的地方。 (当然,在调试之后,删除那些 session.flush()。)





    在我的情况下, real 异常发生在 try / catch {} 块内,其中 catch 抑制了异常(没有重新抛出或警告我)。

    I have a hibernate and JSF2 application going to the deployment server and suddenly throwing an org.hibernate.AssertionFailure: null id in exception. I will provide the stack trace and code immediately but here are four important issues first:

    1. This happens only on the deployment server (Jboss & MySql running on Windows Sever 2008.) It does not happen on my development machine (Tomcat and MySql running on Windoes 7 Pro) and also not on the staging environment (Jboss and MySql running on Linux.)

    2. Researching this, it seems that people get this error when trying to insert an object. But I get the error when I'm doing a simple query. (various different queries, actually, as the error pops up on several pages randomly.)

    3. The error hits only every now and then. If I do a Jboss restart it goes away, but a time later returns. Also, it's not consistent, on some clicks it's there, on others it's not. Even when it hits, when I do a simple refresh of the page it returns fine.

    4. I'm using c3p0 (config below)

    Any idea what's going on?

    The code details:

    This happens on an address object. Here's the full hbm:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.idex.auctions.model">
    <class name="Address" table="address" lazy="true">
      <id name="addressID" column="AddressID">
            <generator class="native"/>            
      </id>
    
      <property name="street" column="street"/> 
      <property name="city" column="city"/> 
      <property name="zip" column="zip"/> 
      <property name="state" column="state"/> 
      <property name="region" column="region"/> 
      <property name="country" column="country"/> 
    
      <many-to-one name="user" 
           class="com.idex.auctions.model.User" 
           column="userid" 
           unique="true" 
           cascade="save-update"/>
     </class> 
    </hibernate-mapping>
    

    The Java class is straight forward:

    public class Address implements Serializable {
    private static final long serialVersionUID = 7485582614444496906L;
    
    private long addressID;
    private String street;
    private String city;
    private String zip;
    private String state;
    private String region;
    private String country;
    private User user;
    
    public Address() {
    
    }
    public long getAddressID() {
        return addressID;
    }
    public void setAddressID(long addressID) {
        this.addressID = addressID;
    }
    public String getStreet() {
        return street;
    }
    public void setStreet(String street) {
        this.street = street;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getZip() {
        return zip;
    }
    public void setZip(String zip) {
        this.zip = zip;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    public String getRegion() {
        return region;
    }
    public void setRegion(String region) {
        this.region = region;
    }
    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    
    }
    

    The c3p0 configuration:

    <property name="hibernate.c3p0.acquire_increment">1</property> 
    <property name="hibernate.c3p0.idle_test_period">1000</property> 
    <property name="hibernate.c3p0.max_size">20</property>  
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.timeout">1800</property>
    <property name="hibernate.c3p0.max_statements">0</property>
    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
    

    The versions used are

    hibernate3.jar
    
    c3p0-0.9.1.2.jar
    
    myfaces-api-2.1.4.jar
    
    myfaces-impl-2.1.4.jar
    
    mysql-connector-java-5.1.20-bin.jar
    

    The full stacktrace

    org.hibernate.AssertionFailure: null id in com.idex.auctions.model.Address entry 
        (don't flush the Session after an exception occurs)
    org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(
                                              DefaultFlushEntityEventListener.java:78)
    org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(
                                              DefaultFlushEntityEventListener.java:187)
    org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(
                                              DefaultFlushEntityEventListener.java:143)
    org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(
                                              AbstractFlushingEventListener.java:219)
    org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(
                                              AbstractFlushingEventListener.java:99)
    org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(
                                              DefaultAutoFlushEventListener.java:58)
    org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:997)
    org.hibernate.impl.SessionImpl.list(SessionImpl.java:1142)
    org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
    com.idex.auctions.manager.DatabaseManager.getAllObjects(DatabaseManager.java:464)
    com.idex.auctions.ui.NavBean.gotoHome(NavBean.java:40)
    sun.reflect.GeneratedMethodAccessor350.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:735)
    javax.el.BeanELResolver.invoke(BeanELResolver.java:467)
    javax.el.CompositeELResolver.invoke(CompositeELResolver.java:246)
    org.apache.el.parser.AstValue.getValue(AstValue.java:159)
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
    org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.getValue(
                                              ContextAwareTagValueExpression.java:96)
    javax.faces.component._DeltaStateHelper.eval(_DeltaStateHelper.java:246)
    javax.faces.component.UIOutcomeTarget.getOutcome(UIOutcomeTarget.java:50)
    org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils.getOutcomeTargetHref(
                                              HtmlRendererUtils.java:1542)
    org.apache.myfaces.shared.renderkit.html.HtmlLinkRendererBase.renderOutcomeLinkStart(
                                              HtmlLinkRendererBase.java:908)
    org.apache.myfaces.shared.renderkit.html.HtmlLinkRendererBase.encodeBegin(
                                              HtmlLinkRendererBase.java:143)
    javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:502)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:744)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:758)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:758)
    org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(
                                        FaceletViewDeclarationLanguage.java:1900)
    org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:285)
    com.ocpsoft.pretty.faces.application.PrettyViewHandler.renderView(
                                        PrettyViewHandler.java:163)
    javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59)
    org.apache.myfaces.tomahawk.application.ResourceViewHandlerWrapper.renderView(
                                        ResourceViewHandlerWrapper.java:93)
    com.idex.auctions.ui.CustomViewHandler.renderView(CustomViewHandler.java:98)
    org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:115)
    org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:199)
    com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:126)
    com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:118)
    

    解决方案

    The exception:

    org.hibernate.AssertionFailure: null id in entry (don't flush the Session after an exception occurs)

    Tells us that that the session exception has happened before the point where this org.hibernate.AssertionFailure is thrown.

    To be exact, the org.hibernate.AssertionFailure is thrown when the session.flush() is happening, not the point where the error ocurred.

    The above is a fact, thus a possible conclusion from it is: something could be suppressing the original exception.

    So look for other possible points of error: A save() or saveOrUpdate() is possibly trying to persist an entity with a null field where, in the table, the column is NOT NULL?


    TIP: To help in the debugging, try adding a session.flush() after every interaction with the Session object (e.g. session.save(obj), session.merge(obj), etc.), this will hopefully cause the org.hibernate.AssertionFailure to happen earlier, closer to where the real problem is taking place. (Of course, after the debugging, remove those session.flush().)


    In my case, the real exception was taking place inside a try/catch {} block where the catch suppressed the exception (didn't rethrow or warn me about it).

    这篇关于org.hibernate.AssertionFailure:入口中的空id(在异常发生后不刷新会话)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆