5

关于这个主题有很多问题,但我仍然不清楚事务中管理会话的过程。

假设有一些回购:

@Repository
public class SomeRepository {
    @Autowired
    protected SessionFactory sessionFactory;

    @Transactional
    public void doSomething() throws IOException {
        Session session = getSession();
        List<SomeEntity> someEntities = session.createCriteria(SomeEntity.class).list();
        for (int i = index; i < someEntities.size(); i++) {
            /* Some ops with entities */
            if (i % 100 == 0) {
                session.flush();
                session.clear();
            }
        }
        session.close;
    }

    protected Session getSession() {
        return sessionFactory.openSession();
    }
}

这段代码正确吗?每次操作运行时,我真的需要手动打开和关闭(以及刷新和清除)会话吗?我可以getCurrentSession()改用而忘记刷新和关闭(因为我猜交易可能会照顾我的生命周期)?

4

1 回答 1

10

不,这是不正确的。要获取与当前 Spring 事务关联的会话,您必须使用sessionFactory.getCurrentSession().

而且你永远不应该关闭会话:这是 Spring 的工作,它会在事务提交/回滚时关闭它,甚至稍后在使用 open-session-in-view 模式时关闭它。

除了 Hibernate 文档中描述的情况外,通常不需要刷新,这包括在批量插入大量实体时避免增加一级缓存的大小。在你的情况下,这没有意义。

于 2013-08-19T10:35:57.033 回答