【发布时间】:2013-06-11 16:55:17
【问题描述】:
我正在将一个工作项目从 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 transaction management breaks hibernate cascade
【问题讨论】: