当前位置: 首页 > 知识库问答 >
问题:

org.hibernate.AssertionFailure:条目中的null id(发生异常后不要刷新会话)

翟越
2023-03-14

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

>

  • 这只发生在部署服务器(Jboss)上

    研究这一点,人们在尝试插入对象时似乎会出现这种错误。但是当我做一个简单的查询时,我得到了错误。(实际上,各种不同的查询,因为错误会随机出现在多个页面上。)

    错误只会偶尔出现。如果我重新启动Jboss,它会消失,但一段时间后会返回。而且,它并不一致,在一些点击上它在那里,在另一些点击上它不在那里。即使当它点击时,当我对页面进行简单刷新时,它也会很好地返回。

    我使用的是c3p0(配置如下)

    知道这是怎么回事吗?

    代码详细信息:

    这发生在地址对象上。以下是完整的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>
    

    Java类是直截了当的:

    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;
    }
    
    }
    

    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: 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)
    
  • 共有3个答案

    牛昱
    2023-03-14

    @asdcjunior回答正确。在抛出异常之前发生了一些事情。

    在这种情况下(当您针对一个测试处理单个事务时,这种情况经常发生在集成测试中——例如@transaction annotation),我调用的方法是:

    session.clear()
    

    这很有帮助,因为所有“脏”对象都已从当前会话中删除,所以在执行下一次刷新时,问题不会出现。

    示例流程:

    • 插入赋值实体(多对多关系,约束只能存在单个赋值)-

    示例正确的流程:

    • 插入分配实体
    • 插入相同的分配实体
    • 会议。清除()
    • 获取存储库并执行findAll()。大小()

    希望有帮助;)

    游炳
    2023-03-14

    我敢打赌并发问题,但它可能发生在不同的级别:

    • 如果经典的“视图中的开放会话”模式没有正确实现,则hibernate会话可能会在不同的用户之间共享
    • 由于hibernate缓存设置不正确,两个用户会话之间共享了一个实体
    • JDBC连接在两个不同的hibernate会话之间共享(可能性较小)

    除了这些潜在的麻烦来源,我会删除c3p0(可能只是谣言…)因为您的堆栈已经提供了数据源,连接池与事务管理器集成。

    尉迟正平
    2023-03-14

    例外情况:

    org.hibernate.AssertionFailure:条目中的null id(发生异常后不要刷新会话)

    告诉我们会话异常发生在这个org的点之前。冬眠将抛出断言失败

    确切地说,org。冬眠断言失败会话时引发。flush()正在发生,而不是发生错误的地方。

    以上是一个事实,因此从中可以得出一个可能的结论:可能有什么东西在压制最初的例外。

    因此,寻找其他可能的错误点:一个保存()保存或更新()可能试图持久化一个具有null字段的实体,其中,在表中,列是不NULL

    提示:为了帮助调试,请尝试添加会话。flush()每次与会话对象交互后(例如Session.save(obj)会话)。合并(obj)等),这将有望导致组织。冬眠断言失败发生得更早,更接近真正问题发生的地方。(当然,在调试之后,删除那些session.flush()


    在我的例子中,真正的异常发生在一个尝试/捕获块中,其中捕获抑制了异常(没有重新抛出或警告我)。

     类似资料:
    • 编辑:得到一个-1,你能解释一下为什么吗?我搜索了重复项,但没有找到任何重复项。 为我刚刚遇到的问题发布Q/a: 例外情况: org.hibernate.AssertionFailure: null id in xyz (在发生异常后不要刷新会话)

    • 我试图在一个catch块中执行一些更新操作。冬眠例外ConstraintViolationException抛出如下 我正在使用Hibernate 4.3.6 这是我的UserRegistrationRequest实体 这是我的UserSecurityQuestions实体 尝试在catch块中执行更新时,我遇到以下错误 如果我抓住异常而不是约束违反异常看到下面的错误 有人能帮帮我吗,有没有更好的

    • 你好,我是PHP中的web开发人员,最近迁移到javaEE。我在mysql中创建表。这是第一类: . . . 这是我的第二节课: . . .

    • 我设置了一个非常基本的Grails 3 web应用程序,使用jdbc连接到PostgreSQL数据库。下面您可以找到< code>Cluster域类和专用服务的代码。 碰巧用同一个< code>slug参数调用了< code>createCluster方法两次: 导致以下异常 我以为违反一约束会被方法拦截,但显然我错了。好吧,所以我添加了一个try/catch,但它基本上没有效果,异常没有被包装,

    • 问题内容: 当取消注释时,我们将在第二种方法中获得en异常- 当作者。 为什么会这样呢? 问题答案: 问题似乎是Hibernate引发了一个异常(因此当前事务无效),但是随后您尝试在该会话中继续执行更多操作。 正确的方法是将您使用的测试分为2部分,一部分测试空作者,另一部分测试有效作者。 在生产代码(例如控制器)上,您需要重新启动操作(关闭事务,重新启动流程)才能继续。但是,考虑到游戏管理交易的方

    • 问题内容: 我有两节课: 用户 还有另一个这样的类: 角色 : 我写了这样的集成测试: 此测试工作正常。但是,当我将以下行添加到上面的测试代码中时: 我收到这样的错误: 这是怎么回事?我哪里错了? 我正在使用Grails 2.0。 提前致谢。 问题答案: 出现此错误的原因是,当执行语句Role.findBy静态方法时,Hibernate(grails GORM使用)将检查是否需要“ autoFlu