我有一个带有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方法加载的。 在提出问题之前,接口实现以下列方式工作:
@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);
}
如何以正确的方式制作?
答案 0 :(得分:1)
方法
@Override
public void delete(User user) {
delete(user);
}
会一直调用自己,直到堆栈上有内存为止。 你应该把它改成
@Override
public void delete(User user) {
getSession().getCurrentSession().delete(user);
}
或者只是删除它并使用delete
中的AbstractDao
方法。
答案 1 :(得分:0)
如果抽象类中的方法完成了这项工作,那就不要覆盖它。
或者你可以
@Override
public void delete(User user) {
super.delete(user);
}
但这是不必要的。