Hibernate criteria - org.hibernate.TransientObjectException: object references an unsaved transient instance

StackOverflow https://stackoverflow.com/questions/20817116

  •  22-09-2022
  •  | 
  •  

Question

I'm trying to update the value to table. if newly created and saved date_range_id is working good.but when trying to update the value from existing date_range_id its giving me an error `org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing:'. How to update the value to table both cases ?

DateRange dateRange = new DateRange();
             Criteria dateRangeCriteria = session.createCriteria(DateRange.class);
             dateRangeCriteria.add(Restrictions.eq("start_date", startDate));
             dateRangeCriteria.add(Restrictions.eq("end_date", newendDate));
             List drlist = dateRangeCriteria.list();
                if(drlist.size()>0){
                    Iterator it = drlist.iterator();
                    while(it.hasNext())
                    {
                        DateRange std = ( DateRange) it.next();
                        dateRangeId=std.getDate_range_id();
                    }

                }else{

                    dateRange.setStart_date(startDate);
                    dateRange.setEnd_date(newendDate);
                    session.save(dateRange);
                    dateRangeId= dateRange.getDate_range_id();

                }
                Criteria criteria = session.createCriteria(PartFeatureVersion.class);
                criteria.add(Restrictions.eq("part.id",partId));
                criteria.add(Restrictions.eq("featureversion.id", featureVersionId));
                criteria.add(Restrictions.eq("dateRange.id", dateRangeID));
                List list = criteria.list();
                PartFeatureVersion partfeatureversion = (PartFeatureVersion)list.iterator().next();
                //partfeatureversion.setDate_range_id(dateRangeId);
                partfeatureversion.setDateRange(dateRange);
                session.saveOrUpdate(partfeatureversion);
Was it helpful?

Solution

In the case of the existing range, the object dateRange is never set, it's still the 'new DateRange()' it was initialized on.

This should be better:

DateRange dateRange;
if(...){
   dateRange = (DateRange)it.next();
}
else{
   dateRange = new DateRange();
   ...
   session.save(dateRange);
}

Also, you don't need to keep the dateRangeId, you can use the object itself in a Restriction, and it will take the id behind the screens:

criteria.add(Restrictions.eq("dateRange", dateRange));
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top