我正在使用Spring + Spring Data JPA与Hibernate,并需要执行一些大规模且耗费高昂的数据库操作。
我如何使用StatelessSession执行这些操作?
我如何使用StatelessSession执行这些操作?
解决方案是实现一个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
代码的人。希望这对某人有所帮助,对我来说它非常好用。
SessionFactory
/ EntityManager
上启用jdbc批处理语句,通过在SessionFactory配置(即:LocalEntityManagerFactoryBean
)中设置hibernate.jdbc.batch_size
属性来实现。为了获得jdbc批量插入/更新的最佳效果,请尽可能多地编写相同类型的实体。即使配置的批次大小尚未达到,Hibernate也会检测到您何时编写另一种实体类型并自动刷新批处理。JdbcTemplate
类似。使用StatelessSession
的好处是由Hibernate处理映射和转换为SQL。当您使用我的StatelessSessionFactoryBean
时,甚至可以将Session
和StatelessSession
混合在一个事务中使用。但要小心修改由Session
加载并使用StatelessSession
进行持久化的实体,因为这将导致锁定问题。