1. 程式人生 > >Hibernate中refresh報錯

Hibernate中refresh報錯

saveTrackInfoAll(obj,null,mergFlag);             getHibernateTemplate().saveOrUpdate(obj);             getHibernateTemplate().flush();             getHibernateTemplate().refresh(obj); 在用以上方式進行hibernate儲存物件時,報如下錯誤:

Caused by: org.hibernate.UnresolvableObjectException: No row with the given identifier exists: [flex.esb.model.EsbMessageRecord#18090237664875]

該問題是因為原始碼中:    esbMessageRecord.setId(new BigDecimal(generateSeqId)); 封裝物件時,添加了id,而實體類中id是自增主鍵@Id     @GeneratedValue(generator = "dateAndIpSequence")     @GenericGenerator(name = "dateAndIpSequence", strategy = "flex.common.hibernate.IDGenerator")     public BigDecimal getId() {};

最近使用hibernate儲存資料的時候,沒有使用id自增主鍵,而是使用了一種呼叫seq以後手動賦值的方式生成主鍵,然後使用saveorupdate()報錯。上網檢視終於知道了問題所在,記錄一下:

在單主鍵情況,save()和saveorupdate()到底有啥區別: 如果持久物件使用了自增長的單主鍵(一般情況下也都是這麼做)。通常兩者沒什麼區別。 但是如果持久物件使用自己賦值的單主鍵,那麼使用saveOrUpdate就不大合適了。 例如:如果你將一個持久物件的主鍵賦值了,你本想插入這條記錄,但實際上執行的是更新,因為hibernate會認為你的主鍵存在了,那麼它會採用更新。但如果你使用save,那麼hibernate直接插入資料。也就是物件中有id如果執行方法saveorupdate那麼就是更新操作,但是此時如果資料庫中沒有該資料就會報錯。解決方法:去掉id手動賦值。