我有冬眠的春季项目。当我尝试以这种方式删除对象时:
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方法加载的。
在提出问题之前,接口实现以下列方式工作:
@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);
}
或者只是将其删除并使用
delete
中的AbstractDao
方法。