当前位置: 首页 > 知识库问答 >
问题:

org . hibernate . lazyinitializationexception:无法初始化代理-没有会话

丰智
2023-03-14

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

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

我想得到一些建议或帮助。我尝试使用注释< code>transactional,但不知道在哪种情况下应该使用< code > implements Serializable 。当然,我知道如果我想在视图范围内使用bean,我应该使用客户端保存方法,并且bean应该是implenebts seriailzable。如果我使用其他非原语字段,它也应该是可序列化的。这意味着在接口IDao和ITestSystemService中使用inplenetserializable没有什么不好。

我的通用刀

public interface IDao<T> extends Serializable{
    List<T> getAll() throws DAOException;
    T get(Long id) throws DAOException;
}

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();
    }

}

在我的带有视图范围的JSF bean控制器中,我每次都遇到这个结构的问题。

我应该在申请结构上改变什么?

共有1个答案

沈伟
2023-03-14

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

SubjectServiceImpl

    < li >这可能是单例作用域-服务没有状态。 < Li > subject DAO不需要setter(我会使用构造函数注入并使subject DAO成为final。 < li >创建getAll方法@Transaction(正如您在问题中回避的那样)——这将确保Spring将Hibernate会话绑定到执行线程。然后,可以使用session factory # getCurrentSession()来实现这一点。

受冬眠影响

  • 删除与事务相关的代码,例如transaction=session.beginTransaction()。会话的提供将由服务方法上的@Transactional注释处理
  • 删除所有回滚代码
  • 使DAO的作用域为单例-再次为无状态。它应该取决于最终的SessionFactory变量
  • 通过构造函数注入SessionFactory(字段注入不是很好)

一旦你做了以上所有的事情,你可能会发现你的问题消失了(从你的问题看不出实际的问题是什么)。您的代码的最大问题是手动事务混合了session factory # getCurrentSession()的使用。

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

 类似资料:
  • 问题内容: 我有2台物理服务器,我的Web应用程序命中该服务器由负载均衡器管理。我总是得到- org.hibernate.LazyInitializationException:无法初始化代理-没有会话 当其中一台服务器受到攻击而另一台服务器运行平稳而没有任何问题时。我有一个由应用程序启用和管理的本地托管缓存存储。仅当尝试从一个表访问一个特定的列时,才会发生此异常。不管选择哪个服务器,其余的操作都

  • 问题内容: 我试图从数据库中的对象进行简单加载,但出现错误“无法初始化代理-没有会话”,知道吗?谢谢 问题答案: 尝试添加到validate方法: 发生的事情是,因为没有注释,所以没有与该方法关联的会话,并且每个查询都将在其自己的会话中运行,该会话随后将立即关闭。 该方法始终返回一个代理,与之不同(请参阅此处,了解load与get之间的差异)。 因此,返回了代理,但是由于缺少代理,因此立即关闭了创

  • 我试图从DB中的一个对象做一个简单的加载,但是我得到的错误是“Could not initialize proxy-no session”,有什么想法吗?谢谢

  • 我正在尝试使用Primeface JSF Spring Boot做一个示例User CRUD页面。在页面上,我有一个启用LazyLoding的表。我的User对象没有1对N或N对1字段,都是原始字段,在到达时不需要数据库访问或初始化。(所以FetchType.EAGER不会有帮助) 当试图在弹出窗口上显示用户列表中的用户时,出现以下异常: 为什么 JSF 组件尝试从数据库中更新对象以获取 1 比

  • 问题内容: 对数据库有以下查询: 在获取employee.address.street,employee.address.houseNumber或employee.address.city时,它将失败,但以下情况除外: 员工映射: 地址映射: 对于其他类(办公室,公司等),这​​是绝对正常的。如果注释,则在jsp应用程序中加载地址字段的行将正常工作。怎么了?顺便说一下,尽管有异常,它仍显示有关js

  • 抱歉,如果我的帖子是重复的,但我不能从另一个主题解决我的问题,所以我创建了这个主题。希望有人帮助我。我用的是Hibernate,JSF和Glassfish。 这是我的完整代码 CusterBean(请求范围) 顾客道 xhtml 我得到这个错误: SEVERE:javax.el.ELException: /admin/customer_list.xhtml@68,106 value="#{cust

  • 问题内容: 我得到以下异常: 当我尝试从以下几行拨打电话时: 我首先实现了这样的方法: 并得到了例外。然后一位朋友建议我始终测试该会话并获取当前会话,以避免出现此错误。所以我这样做: 但仍然会出现相同的错误。我已经阅读了很多有关此错误的内容,并找到了一些可能的解决方案。其中之一是将lazyLoad设置为false,但是不允许这样做,因此建议我控制会话 问题答案: 这是错误的,因为您在提交事务时将会

  • 我得到以下例外情况: 当我尝试从main调用以下线路时: