我正在使用Spring + Spring Data JPA和Hibernate,我需要执行一些大而昂贵的数据库操作。
如何使用StatelessSession
执行这些操作?
答案 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
时,您甚至可以在一次交易中混合Session
和StatelessSession
混合。但要小心修改Session
加载的实体并将其与StatelessSession
一起保留,因为这会导致锁定问题。