Java 如何使用Spring transactional(@transactional)实现hibernate批插入?

Java 如何使用Spring transactional(@transactional)实现hibernate批插入?,java,spring,hibernate,transactions,Java,Spring,Hibernate,Transactions,我在后端使用Spring5.x和普通Hibernate。我想将数据从一个数据库传输到另一个数据库,一次处理1000条记录作为一个批处理。我在两个数据库中都有相同的表。我们已经配置了2个事务管理器和2个数据源详细信息。 我在hbm文件中配置了batch size=“1000”,如下所示 <hibernate-mapping> <class table="User" name="com.my.User" batch-size="

我在后端使用Spring5.x和普通Hibernate。我想将数据从一个数据库传输到另一个数据库,一次处理1000条记录作为一个批处理。我在两个数据库中都有相同的表。我们已经配置了2个事务管理器和2个数据源详细信息。 我在hbm文件中配置了batch size=“1000”,如下所示

<hibernate-mapping>
  <class table="User" name="com.my.User" batch-size="1000">
  <id name="id" .../>
  <property name="name" ...>
  ...
@Transactional(value="oldDBTransactionManager" propagation = Propagation.SUPPORTS, readOnly = true)
public class GetUserServiceImpl extends HibernateDaoImpl implements GetUserService {
...
  public List<User> getAllUsers(int firstResult, int maxResults) {
            DetachedCriteria criteria =  DetachedCriteria.forClass(User.class);
            criteria.addOrder(Order.asc("id"));
    
            List results = getHibernateTemplate().findByCriteria(criteria, firstResult, maxResults);
         
    if (!results.isEmpty()) {
        for (User user: results ) {
            saveUserService.saveUser(user);
        }
    }
    return results;
...
}

 @Transactional(value="newDBTransactionManager" propagation = Propagation.SUPPORTS, readOnly = true)
    public class SaveUserServiceImpl extends HibernateDaoImpl implements SaveUserService{
    ...
        @Transactional(value="newDBTransactionManager", propagation = Propagation.REQUIRED, readOnly = false)
    @Qualifier("newDBTransactionManager")
    public void saveUser(User user) {
        getHibernateTemplate().save(user);
    }
    ...

...
我用@Transactional注释了两个服务类,并实现如下

<hibernate-mapping>
  <class table="User" name="com.my.User" batch-size="1000">
  <id name="id" .../>
  <property name="name" ...>
  ...
@Transactional(value="oldDBTransactionManager" propagation = Propagation.SUPPORTS, readOnly = true)
public class GetUserServiceImpl extends HibernateDaoImpl implements GetUserService {
...
  public List<User> getAllUsers(int firstResult, int maxResults) {
            DetachedCriteria criteria =  DetachedCriteria.forClass(User.class);
            criteria.addOrder(Order.asc("id"));
    
            List results = getHibernateTemplate().findByCriteria(criteria, firstResult, maxResults);
         
    if (!results.isEmpty()) {
        for (User user: results ) {
            saveUserService.saveUser(user);
        }
    }
    return results;
...
}

 @Transactional(value="newDBTransactionManager" propagation = Propagation.SUPPORTS, readOnly = true)
    public class SaveUserServiceImpl extends HibernateDaoImpl implements SaveUserService{
    ...
        @Transactional(value="newDBTransactionManager", propagation = Propagation.REQUIRED, readOnly = false)
    @Qualifier("newDBTransactionManager")
    public void saveUser(User user) {
        getHibernateTemplate().save(user);
    }
    ...
@Transactional(value=“oldDBTransactionManager”传播=propagation.SUPPORTS,只读=true)
公共类GetUserServiceImpl扩展了HibernateDaioImpl实现GetUserService{
...
公共列表getAllUsers(int firstResult、int maxResults){
DetachedCriteria=DetachedCriteria.forClass(User.class);
标准.addOrder(Order.asc(“id”));
List results=getHibernateTemplate().findByCriteria(criteria、firstResult、maxResults);
如果(!results.isEmpty()){
for(用户:结果){
saveUserService.saveUser(用户);
}
}
返回结果;
...
}
@事务性(value=“newDBTransactionManager”传播=propagation.SUPPORTS,只读=true)
公共类SaveUserServiceImpl扩展HibernateDaoImpl实现SaveUserService{
...
@事务性(value=“newDBTransactionManager”,传播=propagation.REQUIRED,只读=false)
@限定符(“newDBTransactionManager”)
公共void saveUser(用户){
getHibernateTemplate().save(用户);
}
...
我正在从服务层外部(外部事务)调用上述getAllUsers服务方法,它将在内部调用saveUser服务方法(使用其他事务管理器),如下所示:

public class UserProcessActivity{
    private int maxUsersPerIteration = 50;
    ...
    private void processUsers(){
        List<User> usersList;

        long counter = 0;
        int firstResult = 0;
        usersList = getUserService.getAllUsers(firstResult, maxUsersPerIteration);

        while (!usersList.isEmpty()) {
           // some logic...    
            firstResult += usersList .size();
            usersList = getUserService.getAllUsers(firstResult, maxUserPerIteration);
        }
    }
...
公共类UserProcessActivity{
私有int maxUsersPerIteration=50;
...
私有void processUsers(){
列出用户列表;
长计数器=0;
int firstResult=0;
usersList=getUserService.getAllUsers(firstResult,maxUsersPerIteration);
而(!usersList.isEmpty()){
//一些逻辑。。。
firstResult+=usersList.size();
usersList=getUserService.getAllUsers(firstResult,MaxUserPeraction);
}
}
...
我这里的问题是上面的代码是否处理批插入

如果是,作为批次1000(以hbm声明的批次大小)或50(使用MaxUserPacification为50指定的调用服务方法)插入的记录数是多少

如果不作为批处理执行插入操作,如何使用Spring@Trasactional和Hibernate实现批插入

如何对此批插入操作查询启用日志记录以了解实际的批操作信息

提前感谢。

我建议阅读说明在hibernate中需要配置什么以实现批处理。我建议阅读说明在hibernate中需要配置什么以实现批处理。