我正在将一个工作项目从 Spring2+Hibernate3 升级到 Spring3+Hibernate4。由于 HibernateTemplate 和 HibernateDAOSupport 已经退役,我做了以下
之前(简化)
public List<Object> loadTable(final Class<?> cls)
{
Session s = getSession(); // was calling the old Spring getSession
Criteria c = s.createCriteria(cls);
List<Object> objects = c.list();
if (objects == null)
{
objects = new ArrayList<Object>();
}
closeSession(s);
return objects;
}
现在(简化)
@Transactional(propagation=Propagation.REQUIRED)
public List<Object> loadTable(final Class<?> cls)
{
Session s = sessionFactory.getCurrentSession();
Criteria c = s.createCriteria(cls);
List<Object> objects = c.list();
if (objects == null)
{
objects = new ArrayList<Object>();
}
return objects;
}
我还将事务注释声明添加到 Spring XML 并从 Hibernate 属性中删除
"hibernate.current_session_context_class", "org.hibernate.context.ThreadLocalSessionContext"
正如我在堆栈跟踪中看到的那样,@Transactional 注释似乎有效
at com.database.spring.DatabaseDAOImpl$$EnhancerByCGLIB$$7d20ef95.loadTable(<generated>)
在初始化期间,上面概述的更改似乎适用于对 loadTable 函数的一些调用,但是当它开始加载具有父级的实体时,我得到“不再引用 cascade="all-delete-orphan" 的集合“ 错误。由于我没有触及任何其他设置/获取父母或孩子的代码,并且只是试图修复 DAO 方法,并且查询只是执行 sql SELECT,所以任何人都可以看到代码被破坏的原因吗?
该问题似乎类似于Spring 事务管理中断休眠级联