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(字段注入不是很好)
您尚未提供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 exceptiongetNamedQuery无效
,我在spring中使用xml和jarcom.springsource.org.aopalliance-1.0.0.jar添加事务代理行为
这与构造函数注入无关。出于某种原因未创建操作。有大量可用资源可帮助您解决该问题。