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);
}
String hql = "DELETE FROM TranCode WHERE id IN (:ids)";
Query query = getSession().createQuery(hql);
query.setParameterList("ids", ids); // ids 為主鍵集合
int deletedCount = query.executeUpdate();
StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
for (TranCode entity : list) {
session.delete(entity);
}
tx.commit();
session.close();
Collection 直接傳給 delete()/save()/update() 等單實體操作方法。DELETE ... WHERE ...,避免加載實體到 Session,減少內存佔用與資料庫往返。session.flush()、session.clear())防止 OOM。