我有一个带有 hibernate 的 Spring 项目。当我尝试以这种方式删除对象时:
User ent = userDaoImpl.load(User.class, 1);
userDaoImpl.delete(ent);
结果如下:
root cause
java.lang.StackOverflowError
com.maxim.spring.dao.UserDaoImpl.delete(UserDaoImpl.java:50)
com.maxim.spring.dao.UserDaoImpl.delete(UserDaoImpl.java:50)
com.maxim.spring.dao.UserDaoImpl.delete(UserDaoImpl.java:50)
com.maxim.spring.dao.UserDaoImpl.delete(UserDaoImpl.java:50)
com.maxim.spring.dao.UserDaoImpl.delete(UserDaoImpl.java:50)
com.maxim.spring.dao.UserDaoImpl.delete(UserDaoImpl.java:50)
com.maxim.spring.dao.UserDaoImpl.delete(UserDaoImpl.java:50)
com.maxim.spring.dao.UserDaoImpl.delete(UserDaoImpl.java:50)
com.maxim.spring.dao.UserDaoImpl.delete(UserDaoImpl.java:50)
com.maxim.spring.dao.UserDaoImpl.delete(UserDaoImpl.java:50)
com.maxim.spring.dao.UserDaoImpl.delete(UserDaoImpl.java:50)
com.maxim.spring.dao.UserDaoImpl.delete(UserDaoImpl.java:50)
com.maxim.spring.dao.UserDaoImpl.delete(UserDaoImpl.java:50)
...
我读到该对象应该位于持久上下文中,因此它是通过 load 方法加载的。 在回答问题之前,接口(interface)实现按以下方式工作:
@Override
public void delete(User user) {
delete(user);
}
@Override
public User load(Class cl, int id){
return (User) getSession().getCurrentSession().load(cl, id);
}
并且实现也扩展了 AbstractDao。
AbstractDao方法:
public void delete(Object entity) {
getSession().getCurrentSession().delete(entity);
}
如何正确制作?
最佳答案
方法
@Override
public void delete(User user) {
delete(user);
}
将继续调用自身,直到堆栈上有内存为止。 您应该将其更改为
@Override
public void delete(User user) {
getSession().getCurrentSession().delete(user);
}
或者只是删除它并使用 AbstractDao
中的 delete
方法。
关于java - Hibernate 4.3.6 + spring - 递归删除方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40246417/