14

我将 Spring + Spring Data JPA 与 Hibernate 一起使用,我需要执行一些大型且昂贵的数据库操作。

我如何使用 aStatelessSession来执行这些操作?

4

2 回答 2

13

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

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完整的要点。使用 Spring 3.2.2、Spring Data JPA 1.2.0 和 Hibernate 4.1.9。

感谢这个JIRA和附加StatelessSessionFactoryBean代码的人。希望这对某人有所帮助,它对我来说就像一个魅力。

于 2013-03-17T12:15:36.713 回答
4

要获得更好的性能结果,您可以通过在 SessionFactory 配置上设置属性(即:)来启用SessionFactory/上的 jdbc 批处理语句。EntityManagerhibernate.jdbc.batch_sizeLocalEntityManagerFactoryBean

为了获得 jdbc 批量插入/更新的最佳优势,尽可能多地写入相同类型的实体。Hibernate 将检测您何时编写另一种实体类型并自动刷新批处理,即使它尚未达到配置的批处理大小。

使用 StatelessSession 的行为与使用类似 Spring 的JdbcTemplate. 使用 的好处StatelessSession是到 SQL 的映射和转换由 Hibernate 处理。当您使用 my 时StatelessSessionFactoryBean,您甚至可以在一笔交易中混合使用Session和混合。StatelessSession但是要小心修改由 加载的实体Session并将其持久化, StatelessSession因为它会导致锁定问题。

于 2013-04-09T11:27:52.210 回答