【问题标题】:Does Session.getCurrentSession() closes without doing any transaction?Session.getCurrentSession() 是否在不进行任何事务的情况下关闭?
【发布时间】:2021-10-16 07:40:24
【问题描述】:

我正在尝试通过这样做来加载实体:

public void reloadRepository() {
        Session session = getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Hibernate.initialize(Repository.class);
    }

从这个堆栈溢出帖子 (Hibernate openSession() vs getCurrentSession()),它说

当你调用 SessionFactory.getCurrentSession 时,它会创建一个新的 如果会话不存在,则使用相同的会话 当前休眠上下文。它会自动刷新并关闭会话 当事务结束时,您不需要在外部进行。

“交易结束”是什么意思?如果我没有进行任何交易(猜测Hibernate.initialize() 没有进行交易),hibernate 会关闭这个会话吗?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    大概吧。

    我猜你将current_session_context_class 设置为thread(因为你使用的是beginTransaction)。这意味着,根据javadoc,会话只有在事务启动后才可用,并在事务结束时自动销毁。

    我不确定您所说的“不进行任何交易”是什么意思,您只是使用beginTransaction() 进行了一次交易。一旦提交或回滚,事务将结束。即使你都不做,事务最终也会超时,这也算作结束事务。

    【讨论】:

      【解决方案2】:

      之所以这样写,是因为在现代应用程序中,您使用 @Transactional 注释控制事务。您只需将它放在服务方法之上,Hibernate 就会自动打开一个事务,并在它到达方法结束时关闭它。

      我真的不知道您认为您的最后一行代码在做什么,但它看起来非常错误。如果你想加载一个实体,你可以简单地写session.get(),将@Transactional添加到你的方法中并删除session.beginTransaction()Hibernate.initialize()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-07
        • 1970-01-01
        • 1970-01-01
        • 2018-09-30
        • 1970-01-01
        相关资源
        最近更新 更多