Hibernate 4.3.6 + spring - 递归删除方法

时间:2016-10-25 17:45:59

标签: java spring hibernate

我有一个带有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);
}

如何以正确的方式制作?

2 个答案:

答案 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);
}

但这是不必要的。