1. 程式人生 > >object references an unsaved transient instance save the transient instance before flushing

object references an unsaved transient instance save the transient instance before flushing

object references an unsaved transient instance save the transient instance before flushing

物件引用未儲存的瞬態例項,在重新整理前儲存瞬態例項

錯誤例項:

mortgageInfoDTO  MortgagePersonDTO兩者關係 MortgagePersonDTO中包含mortgageInfoDTO  物件

前提:mortgageInfoDTO  MortgagePersonDTO 已存在資料庫中 且新建相同的資料物件(臨時物件)

mortgageInfoDTO = mortgageInfoDAO.saveOrUpdate(mortgageInfoDTO);

list = mortgagePersonDAO.createBatch(MortgagePersonDTOList);

 

解決方法:

錯誤原因:
在呼叫hibernate儲存資料時,需要將資料庫中表對應的持久類物件作為引數傳遞。如果這時的物件中有其他的表字段屬性並且是引用物件型別,那麼這個屬性必須是持久態或者是null的,瞬時態和脫管態都會報錯。我這次報錯就是因為在訂單物件中包含了其他物件,並且這些物件不為null。
如果包含的物件的資料用不到的話,最簡便的解決辦法就是把包含的物件全部置為null。
如果用得到物件中的資料,那麼呼叫持久層的方法重新查詢出對應的物件,此物件此時為持久態,在重新賦值到要儲存的物件中即可。

修改方法:

mortgageInfoDTO = mortgageInfoDAO.saveOrUpdate(mortgageInfoDTO);

MortgageInfoDTO mor = mortgageInfoDAO.findById(mortgageInfoId);

for (MortgagePersonDTO personDTO : MortgagePersonDTOList) {

personDTO.setMortgageInfoDTO(mor);

}

list = mortgagePersonDAO.createBatch(MortgagePersonDTOList);

給personDTO賦予一個持久化的物件去替換那個臨時物件,然後在提交事務。