簡體   English   中英

休眠條件-org.hibernate.TransientObjectException:對象引用了未保存的臨時實例

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

我正在嘗試將值更新為表。 如果新創建並保存的date_range_id工作正常,但是嘗試從現有的date_range_id更新值時,會給我一個錯誤“ org.hibernate.TransientObjectException:對象引用了一個未保存的臨時實例-在刷新前保存該臨時實例:”。 如何在兩種情況下將值更新為表?

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

在現有范圍的情況下,永遠不會設置對象dateRange,它仍然是初始化時使用的“新DateRange()”。

這應該更好:

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

另外,您無需保留dateRangeId,可以在Restriction中使用對象本身,它將帶ID到屏幕后面:

criteria.add(Restrictions.eq("dateRange", dateRange));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM