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 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) (等等) 当试图通过主键获取
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))这就成功了。非常感谢!!