如何将StatelessSession与Spring Data JPA和Hibernate一起使用?

时间:2013-03-17 12:15:37

标签: spring hibernate jpa spring-data-jpa stateless-session

我正在使用Spring + Spring Data JPA和Hibernate,我需要执行一些大而昂贵的数据库操作。

如何使用StatelessSession执行这些操作?

2 个答案:

答案 0 :(得分:11)

解决方案是实现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和完整的Gist here。使用Spring 3.2.2,Spring Data JPA 1.2.0和Hibernate 4.1.9。

感谢此JIRA以及附加StatelessSessionFactoryBean代码的人。希望这对某些人有所帮助,它对我来说就像是一种魅力。

答案 1 :(得分:3)

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

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

使用StatelessSession的行为与使用Spring JdbcTemplate之类的行为基本相同。使用StatelessSession的好处是,SQL的映射和转换由Hibernate处理。当您使用我的StatelessSessionFactoryBean时,您甚至可以在一次交易中混合SessionStatelessSession混合。但要小心修改Session加载的实体并将其与StatelessSession一起保留,因为这会导致锁定问题。