如何将无状态会话与Spring数据JPA和Hibernate一起使用?
我在Hibernate中使用Spring+Spring数据JPA,我需要执行一些大型且昂贵的数据库操作如何将无状态会话与Spring数据JPA和Hibernate一起使用?,spring,hibernate,jpa,spring-data-jpa,stateless-session,Spring,Hibernate,Jpa,Spring Data Jpa,Stateless Session,我在Hibernate中使用Spring+Spring数据JPA,我需要执行一些大型且昂贵的数据库操作 如何使用无状态会话执行此类操作?解决方案是实现一个Spring factory bean来创建此无状态会话,并将其注入自定义存储库实现中: public class MyRepositoryImpl implements MyRepositoryCustom { @Autowired private StatelessSession statelessSession;
如何使用
无状态会话
执行此类操作?解决方案是实现一个Spring factory bean来创建此无状态会话
,并将其注入自定义存储库实现中:
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;
}
}
查看无状态SessionFactoryBean
和完整的要点。使用Spring3.2.2、SpringDataJPA1.2.0和Hibernate4.1.9
多亏了这一点,还有那个附加了
无状态SessionFactoryBean
代码的家伙。希望这对某些人有所帮助,它对我来说是一种魅力。为了获得更好的性能结果,您可以通过在SessionFactory配置上设置hibernate.jdbc.batch_size
属性,在SessionFactory
/EntityManager
上启用jdbc批处理语句(即:LocalEntityManagerFactoryBean
)
为了获得jdbc批插入/更新的最佳好处,请尽可能多地写入相同类型的实体。Hibernate将检测您何时写入另一个实体类型,并自动刷新批,即使尚未达到配置的批大小
使用无状态会话的行为与使用Spring的
JdbcTemplate
基本相同。使用无状态会话的好处是到SQL的映射和转换由Hibernate处理。使用my无状态会话FactoryBean
时,甚至可以混合使用会话
和无状态会话
混合在一个事务中。但是请小心修改由会话
加载的实体并将其持久化为无状态会话
,因为这将导致锁定问题。由于会话具有数据库连接,您是否担心无状态会话实例的生存期?无状态会话持有的连接的生存期是否与MyRepositoryImpl实例的生存期基本相同?它看起来像是一个代理,而真正的无状态会话是由无状态会话同步关闭的。我们在项目中使用了无状态会话代码。但是,我们需要迁移代码to SpringBoot 1.5.12版本。因此它继承了Hibernate 5.0.12。我们遇到了一个问题,TransactionContext不存在。甚至HibernateEntityManagerFactory也在折旧。如果您能提供帮助,那将非常棒。