我正在使用一個 hibernate 3.6 項目,該項目使用注釋進行映射,現在我將其遷移到 hibernate 5.1,并且我遇到了這個運行時異常 Non-entity object instance pass to evict 下面是對 evict 的調用HibernateUtils.getSession().evict(origProject.getProbidinfo());HibernateUtils.getSession().evict(origProject);下面是引發異常的 DefaultEvictEventListener.class 的代碼EntityPersister persister = null; final String entityName = persistenceContext.getSession().guessEntityName( object ); if ( entityName != null ) { try { persister = persistenceContext.getSession().getFactory().getEntityPersister( entityName ); } catch (Exception ignore) { } } if ( persister == null ) { throw new IllegalArgumentException( "Non-entity object instance passed to evict : " + object ); }在我的 hibernate 5.1 中,持久化器為 null。如果不清楚,我可以提供更多詳細信息
2 回答

MM們
TA貢獻1886條經驗 獲得超2個贊
在版本 4.2 之前,hibernate 會忽略異常“傳遞給驅逐的非實體對象實例”,該異?,F在會拋出:
java.lang.IllegalArgumentException:傳遞給驅逐的非實體對象實例。
在 4.2 之前的 hibernate 版本中,由于DefaultEvictEventListener.java#L91-L94沒有 else 部分,因此它被忽略。
從版本 4.2 開始,添加了 else 部分,如我們在DefaultEvictEventListener.java#L99-L115中看到的那樣。
在研究這個錯誤之后,我在網上找到的唯一建議是我們捕獲并忽略這個異常。
然而,即使它不是一個完美的解決方案,我認為,省略導致異常的 evict 調用是我更喜歡的,因為我可以將其放在緩存中。

喵喵時光機
TA貢獻1846條經驗 獲得超7個贊
Hibernate 檢查您傳遞的對象是實體,因此它不想逐出或分離任何對象(在我的例子中是 ArrayList)或除實體之外的 null。
我更喜歡對解決方案進行空檢查或類型檢查,而不是捕獲并忽略
添加回答
舉報
0/150
提交
取消