Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Spring org.hibernate.LazyInitializationException:无法初始化代理-再次没有会话_Spring_Hibernate_Jsf 2 - Fatal编程技术网

Spring org.hibernate.LazyInitializationException:无法初始化代理-再次没有会话

Spring org.hibernate.LazyInitializationException:无法初始化代理-再次没有会话,spring,hibernate,jsf-2,Spring,Hibernate,Jsf 2,我知道我的问题很奇怪,很难理解 我为我的项目创建了一些结构。但每次我都会遇到不同的问题,比如无法初始化代理-再次没有会话或不可序列化异常 我想得到一些建议或帮助。我尝试使用注释事务性,但我不明白在哪种情况下应该使用实现可序列化。当然,我知道如果我想使用具有视图范围的bean,我应该使用客户机保存方法,并且bean应该是implenebts可序列化的。如果我使用其他非原语字段,它也应该是可序列化的。这意味着在IDao和ITestSystemService接口中使用可序列化的inmplenets并没

我知道我的问题很奇怪,很难理解

我为我的项目创建了一些结构。但每次我都会遇到不同的问题,比如
无法初始化代理-再次没有会话
不可序列化异常

我想得到一些建议或帮助。我尝试使用注释
事务性
,但我不明白在哪种情况下应该使用
实现可序列化
。当然,我知道如果我想使用具有视图范围的bean,我应该使用客户机保存方法,并且bean应该是implenebts可序列化的。如果我使用其他非原语字段,它也应该是可序列化的。这意味着在IDao和ITestSystemService接口中使用可序列化的inmplenets并没有什么坏处

我的通用刀

public interface IDao<T> extends Serializable{
    List<T> getAll() throws DAOException;
    T get(Long id) throws DAOException;
}
公共接口IDao扩展了可序列化{
List getAll()抛出异常;
T get(长id)抛出异常;
}
DAO实现

@Repository("subjectDAO")
@Scope("prototype")
public class SubjectHibernateDAO implements ISubjectDAO{

    private static final long serialVersionUID = 1L;

    private static final Logger logger = Logger.getLogger(SubjectHibernateDAO.class);

    @Autowired
    private SessionFactory hibernateSessionFactory;
    //getter and setter

    @SuppressWarnings("unchecked")
    @Override
    public List<Subject> getAll() throws DAOException {
        Session session = hibernateSessionFactory.getCurrentSession();

        Transaction transaction = null;
        List<Subject> subjectList = null;
        try{
            transaction = session.beginTransaction();
            subjectList = session.getNamedQuery(GET_ALL_SUBJECTS_NAME_QUERY).list();
            transaction.commit();
        }  catch (HibernateException e) {
            if (transaction != null)
                transaction.rollback();
            logger.error(SQL_EXCEPTION_IN_QUERY, e);
            throw new DAOException(SQL_EXCEPTION_IN_QUERY, e);
        }
        return subjectList;
    }

// Generic service interface
public interface ITestSystemService<T> extends Serializable{

    List<T> getAll() throws DAOException;
}

//Service realization
@Service("subjectService")
@SessionScoped
public class SubjectServiceImpl implements ISubjectService{

    private static final long serialVersionUID = 1L;

    @Autowired
    @Qualifier("subjectDAO")
    private IDao<Subject> subjectDAO;

    public void setSubjectDAO(IDao<Subject> subjectDAO) {
        this.subjectDAO = subjectDAO;
    }

    @Override
    public List<Subject> getAll() throws DAOException {
        return subjectDAO.getAll();
    }

}
@Repository(“subjectDAO”)
@范围(“原型”)
公共类SubjectHibernateDAO实现了ISubjectDAO{
私有静态最终长serialVersionUID=1L;
私有静态最终记录器Logger=Logger.getLogger(SubjectHibernateDAO.class);
@自动连线
私人会话工厂休眠会话工厂;
//接二连三
@抑制警告(“未选中”)
@凌驾
public List getAll()引发异常{
会话=hibernateSessionFactory.getCurrentSession();
事务=空;
List subjectList=null;
试一试{
事务=session.beginTransaction();
subjectList=session.getNamedQuery(获取所有主题名称查询).list();
commit();
}捕获(休眠异常e){
if(事务!=null)
transaction.rollback();
错误(查询中的SQL异常,e);
抛出新的异常(查询中的SQL异常,e);
}
返回主题列表;
}
//通用服务接口
公共接口ITestSystemService扩展了可序列化{
List getAll()抛出异常;
}
//服务实现
@服务(“主体服务”)
@会议范围
公共类SubjectServiceImpl实现isSubjectService{
私有静态最终长serialVersionUID=1L;
@自动连线
@限定词(“subjectDAO”)
私家伊道主语道;
公共无效setSubjectDAO(IDao subjectDAO){
this.subjectDAO=subjectDAO;
}
@凌驾
public List getAll()引发异常{
返回subjectDAO.getAll();
}
}
在具有视图范围的JSFbean控制器中,每次遇到这种结构的问题时,我都会这样做


我应该在我的应用程序的结构中更改什么?

我将对您编写的内容进行以下更改:

SubjectServiceImpl

  • 这可能是单例作用域-服务没有状态
  • 您不需要subjectDAO的setter(我将使用构造函数注入并使subjectDAO成为最终的)
  • 使用getAll方法@Transaction(正如您在问题中回避的那样)-这将确保Spring将Hibernate会话绑定到执行线程。然后可以使用SessionFactory#getCurrentSession()使用此方法
受冬眠影响

  • 删除与事务相关的代码,例如transaction=session.beginTransaction()。会话的提供将由服务方法上的@Transactional注释处理
  • 删除所有回滚代码
  • 使DAO的作用域为单例-再次为非状态。它应该取决于最终的SessionFactory变量
  • 通过构造函数注入SessionFactory(字段注入不是很好)
完成以上所有操作后,您可能会发现问题消失了(从您的问题中看不出实际的问题是什么)。代码的最大问题是混合使用SessionFactory#getCurrentSession()的手动事务


您尚未提供Spring配置,但要使用@Transactional,您需要在Spring中启用事务代理行为。您可以在xml中使用@EnableTransactionManagement,并使用@EnableTransactionManagement进行注释。

使用openConnection方法而不是currentSession。我认为您需要为每个事务使用openSession方法n、 但是当您通过openSession打开会话时,必须手动关闭它。
@Repository(“questionDAO”)公共类QuestionHibernateDAO实现IQuestionDAO{private static final long serialVersionUID=1L;private final SessionFactory hibernateSessionFactory;@Autowired public QuestionHibernateDAO(SessionFactory seFactory){this.hibernateSessionFactory=seFactory;}
我尝试通过构造函数注入SessionFactory,但如果没有活动事务,get exception
getNamedQuery无效
,我在spring中使用xml和jar
com.springsource.org.aopalliance-1.0.0.jar添加事务代理行为
这与构造函数注入无关。出于某种原因未创建操作。有大量可用资源可帮助您解决该问题。