为什么在使用HibernateItemWriter时需要LocalSessionFactoryBean的HibernateTransactionManager和SessionFactory
默认情况下,如果提供
DataSourcebean,Spring
Batch将使用
DataSourceTransactionManager来管理事务。该事务管理器对您的JPA
/hibernate上下文一无所知。因此,
HibernateItemWriter在
Session后台使用Hibernate 的并没有“意识到”
DataSourceTransactionManager。因此,错误:
no transaction is in progress。
这
HibernateTransactionManager就是使Hibernate
Session参与Spring托管事务的原因。
JpaItemWriter和HibernateItemWriter之间的主要区别是什么?
在
JpaItemWriter使用JPA的API(
EntityManagerFactory和
EntityManager)写的项目。它不使用任何JPA提供程序特定的API。这样就可以在不更改编写器的情况下切换JPA提供程序。
在
HibernateItemWriter在另一侧使用Hibernate特定API(
SessionFactory和
Session)和特定于仅hibernate。该组件对于直接使用hibernate而不使用JPA的应用程序很有用。您可能具有相同的编写器,但对于另一个JPA提供程序,例如,
OpenJpaItemWriter或
EclipselinkItemWriter使用这些提供程序中的特定API。



