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