如何在Spring Data JPA和Hibernate中使用StatelessSession?

15
我正在使用Spring + Spring Data JPA与Hibernate,并需要执行一些大规模且耗费高昂的数据库操作。
我如何使用StatelessSession执行这些操作?
2个回答

13

解决方案是实现一个Spring工厂bean来创建这个StatelessSession并将其注入到您的自定义仓库实现中:

一个解决方案是实现一个Spring工厂bean去创建这个 StatelessSession 并注入到你的自定义repositories实现中:

public class MyRepositoryImpl implements MyRepositoryCustom {

    @Autowired
    private StatelessSession statelessSession;

    @Override
    @Transactional
    public void myBatchStatements() {
        Criteria c = statelessSession.createCriteria(User.class);

        ScrollableResults itemCursor = c.scroll();

        while (itemCursor.next()) {
            myUpdate((User) itemCursor.get(0));
        }
        itemCursor.close();

        return true;
    }

}

请查看 StatelessSessionFactoryBean 和完整的 Gist 这里。使用 Spring 3.2.2、Spring Data JPA 1.2.0 和 Hibernate 4.1.9。

感谢这个JIRA和上传StatelessSessionFactoryBean代码的人。希望这对某人有所帮助,对我来说它非常好用。


1
由于会话持有数据库连接,您是否担心无状态会话实例的生命周期?无状态会话持有的连接寿命难道不与MyRepositoryImpl实例的寿命基本相同吗? - StvnBrkdll
看起来这是一个代理,而真正的无状态会话是由StatelessSessionSynchronization关闭的。 - user472749

4
为了获得更好的性能结果,您可以在SessionFactory / EntityManager上启用jdbc批处理语句,通过在SessionFactory配置(即:LocalEntityManagerFactoryBean)中设置hibernate.jdbc.batch_size属性来实现。为了获得jdbc批量插入/更新的最佳效果,请尽可能多地编写相同类型的实体。即使配置的批次大小尚未达到,Hibernate也会检测到您何时编写另一种实体类型并自动刷新批处理。
使用StatelessSession基本上与使用Spring的JdbcTemplate类似。使用StatelessSession的好处是由Hibernate处理映射和转换为SQL。当您使用我的StatelessSessionFactoryBean时,甚至可以将SessionStatelessSession混合在一个事务中使用。但要小心修改由Session加载并使用StatelessSession进行持久化的实体,因为这将导致锁定问题。

我们在项目中使用了您的StatelessSession代码。然而,我们有一个迁移到SpringBoot 1.5.12版本的要求,因此它继承了Hibernate 5.0.12。在那里,我们遇到了一个问题,即TransactionContext不存在。甚至,HibernateEntityManagerFactory已经过时。如果您能提供帮助,那将非常棒。 - amu61

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接