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

org.hibernate.assertionfailure: non-transient entity has a null id:
org.hibernate.assertionfailure: null id in hibernate
nhibernate null id in
nhibernate assertionfailure: null identifier
this may indicate a bug in hibernate, but is more likely due to unsafe use of the session
org hibernate assertionfailure interceptor onpreparestatement returned null or empty string
org hibernate assertionfailure entity was persistent
don't flush the session after an exception occurs grails

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).

Caused by: org.hibernate.AssertionFailure: null| JBoss.org Content , org.hibernate.AssertionFailure: null id in com.oms.hibernate.rms.mapping.User entry (don't flush the Session after an exception occurs) at  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.

org.hibernate.AssertionFailure: null id in entry (don't , hibernate. AssertionFailure: null id in entry (don't flush the Session after an exception occurs)'. To get rid of this problem, I cleared the hibernate session when the exception occurs with session. clear(). Re: Caused by: org.hibernate.AssertionFailure: null id in com.oms.hibernate.rms.mapping.User entry (don't flush the Session after an exception occurs) ali1983 Aug 22, 2009 3:07 PM ( in response to ali1983 )

Hibernate: org.hibernate.AssertionFailure: null id don't flush the , org.hibernate.AssertionFailure: null id in com.comp123.db.domain.tables.​ReportEntry entry (don't flush the Session after an exception occurs). Hibernate: org.hibernate.AssertionFailure: null id don't flush the Session after an exception occurs . Peter Petrov. Greenhorn Posts: 18. posted 10 years ago.

You are probably hitting some Hibernate bug. (I'd recommend upgrading to at least Hibernate 3.3.2.GA.)

Meanwhile, Hibernate does better when your ID is nullable so that Hibernate can always tell the difference between a new object that has not yet been persisted to the database and one that's already in the database. Changing the type of addressID from long to Long will probably work around the problem.

The stack trace you provided shows that you are seeing the problem on a query because your query is forcing buffered writes to be flushed to the database before the query is executed and that write is failing, probably with the same insert problem other people are seeing.

org.hibernate.AssertionFailure: null id in entry (don't flush the , AssertionFailure: null id in entry (don't flush the Session after an exception occurs​). null id error in hibernate org.hibernate.assertionfailure: non-transient entity  org.hibernate.AssertionFailure: null id in models.Software entry (don't flush the Session after an exception occurs) We can see that a session exception has happened before . The point where this org.hibernate.AssertionFailure is thrown is not the point where the error ocurred.

I was facing this issue I just add try catch block and in catch block I wrote seesion.clear(); now I can proceed with the rest of records to insert in database.

org.hibernate.AssertionFailure, AssertionFailure: null id in persisttest.Publication entry (don't flush the Session after an exception occurs) at org.hibernate.event.def. org.hibernate.AssertionFailure: null id in models.Software entry (don't flush the Session after an exception occurs) We can see that a session exception has happened before . The point where this org.hibernate.AssertionFailure is thrown is not the point where the error ocurred.

[Hibernate] AssertionFailure null id in entry, it throws an "org.hibernate.AssertionFailure: null id in entry (don't flush the Session after an exception occurs)". I don't know what this means,  Caused by: org.hibernate.AssertionFailure: null id in com.xxx.Bean entry (don't flush the Session after an exception occurs) En modo de Hibernación usted tiene que tirar la Sesión de Hibernate después de una Sesión relacionadas con la Excepción real ocurre.

org.hibernate.AssertionFailure: null id / jeepxie.net, AssertionFailure:nullidinexception. AssertionFailure: null id in entry ( application going to the deployment server and suddenly throwing an org.​hibernate. Address entry (don't flush the Session after an exception occurs)  "org.hibernate.AssertionFailure: null id in com.idex.auctions.model.Address entry", je pense que la raison pour laquelle Hibernaye vérifiera la propriété 'not-null', donc, supprimer la propriété 'not-null' ou Définir 'not-null' pour 'false', résoudra le problème.

Hibernate [BUG?] AssertionFailure: null id in entry, org.hibernate.AssertionFailure: null id org.hibernate.AssertionFailure: null id in cn​.allobject.db.AReview entry (don't flush the Session after an exception occurs) 

Comments
  • If all else fails, you could take a look at the org.hibernate.event.def.DefaultFlushEntityEventListener.checkId() method and trace back where the id that is found null coming from, then find out how to set it/ensure it is not null. If the problem is indeed due to the Address class, you can put in a break point for where the id is set (maybe a null id is passed). The call is triggered when a flush occurs (which would explain why it is "random": when an auto-flush is required), so you might also want to check on (Address?) objects that have not been flushed yet.
  • Thanks for this, Attila. Can you please expand on how to get the org.hibernate.event.def.DefaultFlushEntityEventListener.checkId() method to help me, and how to check on Address objects that hasn't been flushed yet?
  • Actually how can the address id even be null, when it's a primitive long?
  • I could not find the source for 3.0, but the 3.2 source is available from hibernate.org. Specifically: DefaultFlushEntityEventListener - The exception is thrown, when the id parameter of checkId() is null. You will need to see where that id is comming from (start from the stack trace you provided to see how checkId() is called). The easiest way is to download the whole source and do rearches there.[cont]
  • [cont]Note that there might be slight differences in the downloaded code and the library you are using as they have different versions (maybe get a copy of the 3.2 version of the Hibernate library to ensure you are looking at the code that is actually being executed)
  • How do you fix this? I am trying to save many entities, in a loop. Some of which may fail. How can I get the successful records to persist?
  • @DavidWilliams You should have each save in its own transaction, then.
  • I have the same problem and I'm doing it in separate transactions but the problem is still there. What should I do to be able to save next items in DB using the same ISession object?
  • Perhaps this is a good opportunity to take notice of how absolutely dangerous empty catch blocks are, they can take weeks of time to troubleshoot! Always have something in there that brings it to the developers attention, at least a .printStackTrace. If you are absolutely sure you want it to be empty (Checked exceptions CAN lead to such a situation), justify this in comments.
  • Thanks, Yves. Can you expand on the DataSource with connection pooling, so I will understand why do you suggest removing c3p0?
  • Also, I'm not using the open session in vew pattern. All my hibernate code looks like this: public static List<Auction> findAllAuctions() { String sql = "FROM com.auctions.model.Auction order by startDate desc"; Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); List<Auction> auctions = (List<Auction>)session.createQuery(sql).list(); session.getTransaction().commit(); return auctions; }
  • I have to investigate if such usage may lead to session sharing between threads...
  • I propose to remove c3p0 because Tomcat and JBoss already has pooling feature delivered by JavaEE DataSource. Tomcat uses dbcp by default. My idea is just to remove a component that duplicates a feature already available in your app server stack.
  • Thanks for the c3p0 explanation. I will remove it.