首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Hibernate HQL 刪除報錯 Unknown entity: java.util.ArrayList 解析

     編輯:程式設計綜合問答

錯誤堆棧關鍵信息

org.hibernate.MappingException: Unknown entity: java.util.ArrayList
at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(...)
at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(...)
at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:837)
at com.sunyard.audit.model.modelplat.TranCodeDAO.delete(TranCodeDAO.java:41)

根因分析

HibernateTemplate.delete(Object entity) 期望參數是單個實體對象(或實體集合的單個元素),但代碼傳入了 List<Entity> 或 ArrayList 實例。Hibernate 嘗試將該 List 當作實體持久化對象處理,卻在映射元數據中找不到 java.util.ArrayList 的實體定義,從而拋出 Unknown entity 異常。

錯誤代碼示例

// 錯誤:直接傳入列表
List<TranCode> list = ...;
getHibernateTemplate().delete(list); // 拋出異常

正確修復方式

方法一:遍歷逐個刪除(適用於少量數據)

List<TranCode> list = ...;
for (TranCode entity : list) {
  getHibernateTemplate().delete(entity);
}

方法二:批量刪除 HQL(推薦,性能更好)

String hql = "DELETE FROM TranCode WHERE id IN (:ids)";
Query query = getSession().createQuery(hql);
query.setParameterList("ids", ids); // ids 為主鍵集合
int deletedCount = query.executeUpdate();

方法三:使用 StatelessSession 批量操作(大數據量)

StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
for (TranCode entity : list) {
  session.delete(entity);
}
tx.commit();
session.close();

最佳實踐總結

  • 絕不將 Collection 直接傳給 delete()/save()/update() 等單實體操作方法。
  • 批量刪除優先使用 HQL DELETE ... WHERE ...,避免加載實體到 Session,減少內存佔用與資料庫往返。
  • 若必須遍歷刪除,注意控制 Session 刷新頻率(session.flush()、session.clear())防止 OOM。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved