Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Hibernate,尝试获取实体时堆栈溢出_Java_Spring_Hibernate - Fatal编程技术网

Java Spring Hibernate,尝试获取实体时堆栈溢出

Java Spring Hibernate,尝试获取实体时堆栈溢出,java,spring,hibernate,Java,Spring,Hibernate,我得到: java.lang.StackOverflowerr位于 kamienica.dao.ApartmentDaoImpl.findById(ApartmentDaoImpl.java:52)位于 kamienica.dao.ApartmentDaoImpl.findById(ApartmentDaoImpl.java:52)位于 kamienica.dao.ApartmentDaoImpl.findById(ApartmentDaoImpl.java:52) (等等) 当试图通过主键获取

我得到:

java.lang.StackOverflowerr位于 kamienica.dao.ApartmentDaoImpl.findById(ApartmentDaoImpl.java:52)位于 kamienica.dao.ApartmentDaoImpl.findById(ApartmentDaoImpl.java:52)位于 kamienica.dao.ApartmentDaoImpl.findById(ApartmentDaoImpl.java:52) (等等)

当试图通过主键获取对象时

以下是我的简历:

public abstract class AbstractDao<PK extends Serializable, T> {

    private final Class<T> persistentClass;

    @SuppressWarnings("unchecked")
    public AbstractDao() {
        this.persistentClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass())
                .getActualTypeArguments()[1];
    }

    @Autowired
    private SessionFactory sessionFactory;

    protected SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    protected Session getSession() {
        return sessionFactory.getCurrentSession();
    }


    @SuppressWarnings("unchecked")
    public T findByPK(PK id) {
        Session session = getSession();
        T out = (T) session.load(persistentClass, id);
        session.close();
        return out;
    }
公共抽象类AbstractDao{
私有最终类persistentClass;
@抑制警告(“未选中”)
公开摘要(){
this.persistentClass=(Class)((ParameteredType)this.getClass().getGenericSuperclass())
.getActualTypeArguments()[1];
}
@自动连线
私人会话工厂会话工厂;
受保护的SessionFactory getSessionFactory(){
返回工厂;
}
受保护会话getSession(){
返回sessionFactory.getCurrentSession();
}
@抑制警告(“未选中”)
公共T findByPK(主键id){
Session=getSession();
T out=(T)session.load(persistentClass,id);
session.close();
返回;
}
下面是ApartmentDAO的实现:

@Repository("apatmentDao")
public class ApartmentDaoImpl extends AbstractDao<Integer, Apartment> implements ApartmentDao {

    public void save(Apartment apatment) {
        persist(apatment);

    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Apartment> getList() {
        Criteria criteria = createEntityCriteria();
        criteria.addOrder(Order.asc("apartmentNumber"));
        return (List<Apartment>) criteria.list();
    }

    @Override
    public void deleteByID(int id) {
        Query query = getSession().createSQLQuery("delete from Apartment where id = :id");
        query.setInteger("id", id);
        query.executeUpdate();
    }

    @Override
    public void update(Apartment apatment) {
        update(apatment);
    }


        @Override
        public Apartment findById(int id) {
// If I put System.out.println(id) here it will print id 
// number until the stack overflow
            Apartment ap = findById(id);
            return ap;
        }
@Repository(“apamentdao”)
公共类ApartmentDaoImpl扩展了AbstractDao,实现了ApartmentDao{
公共空间保存(公寓公寓){
坚持;
}
@凌驾
@抑制警告(“未选中”)
公共列表getList(){
标准=createEntityCriteria();
标准.addOrder(Order.asc(“公寓号”));
返回(列表)条件。列表();
}
@凌驾
公共void deleteByID(int-id){
Query Query=getSession().createSQLQuery(“从单元中删除,其中id=:id”);
query.setInteger(“id”,id);
query.executeUpdate();
}
@凌驾
公共空间更新(公寓公寓){
更新(公寓);
}
@凌驾
findById公共公寓(内部id){
//如果我把System.out.println(id)放在这里,它会打印id
//直到堆栈溢出为止
公寓ap=findById(id);
返回ap;
}

我不知道是什么导致了这个问题。其他方法工作得很好…

您正在递归调用
findById
方法

     @Override
        public Apartment findById(int id) {
            // Here you're recursively calling findById
            Apartment ap = findById(id);
            return ap;
        }
我想你可以这样做

        @Override
        public Apartment findById(int id) {
            return findByPK(new Integer(id));
        }

希望这能有所帮助。

问题似乎是您无限期地调用
plant.findById(int-id)
。您应该调用
super.findById(id)
AbstractDao
有这样的方法
findByPK(id)
我更改了'return(T)getSession().get(persistentClass,new Integer((int)id))这就成功了。非常感谢!!