2017-03-01 45 views
0

我有一個實體可以引用同一個實體的另一個對象。當我想要刪除數據庫中的對象時,我可以得到一個ConstraintViolation。因此,我首先搜索具有要刪除的對象的引用的實體,並將該值設置爲null。我使用criteriaBuilder執行此操作並執行批量更新。 之後我刪除了實體。在下一個select語句中出現錯誤:使用Hibernate和幾個EntityManager刪除數據

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance 

這可能是因爲我使用了兩個不同的entityManager實例。第一個是批量更新,第二個是刪除實體。 那麼當第二個entityManager進行刷新時會發生什麼?來自第一個entityManager的數據是否在數據庫中更改?如果是這樣,數據庫中的語句執行的順序是什麼? 還是我犯了另一個錯誤? 謝謝!

+0

你應該使用cascadeType – Vaseph

+0

我通常想獲得ConstraintViolation,因爲它不應該能夠刪除這些數據。但在特殊情況下,應該允許從數據庫中刪除數據。 但是,只是爲了學習一些東西:cascadeType是哪一個可供選擇的? – Markus

+1

你可以使用CascadeType.ALL – Vaseph

回答

0

問題在於批量更新。休眠緩存不知道數據庫中的更改。因此緩存中的被引用的實體不等同於數據庫,並且它崩潰。 我首先必須刷新引用的實體,然後才能正常工作。或者,我必須將批量更新更改爲「正常」更新,其中我加載數據庫中的所有實體並將屬性更改爲空。

相關問題