0

我想加载弹簧启动应用程序与预先存在的数据。我想用“系统”用户填充数据。我有下面的组件定义被拦截并创建一个“系统”用户。问题是此组件事务在针对H2运行弹簧引导应用程序时被提交到数据库,但它是当应用程序与PostgreSQL数据源一起运行时,它不会被提交。请帮我弄清楚如何让交易成功?SpringBoot应用程序 - AuditorAware事务不提交Postgres数据库

被覆盖的实施getCurrentAuditor方法是如下

@Transactional 
@Component("auditorProvider") 
public class UserAuditorAware implements AuditorAware<User> { 

    @Inject 
    private UserRepository userRepository; 

    private User _systemUser; 

    @Override 
    public User getCurrentAuditor() { 
     Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
     if (authentication == null) { 
      if (_systemUser != null) { 
       return _systemUser; 
      } 
      Optional<User> systemUser = userRepository.findOneByUsername("system"); 
      if (!systemUser.isPresent()) { 
       // TODO: decide on which user to designate when entities are created by devices 
       User user = new User("system"); 
       user = userRepository.save(user); 
       userRepository.flush(); 
       systemUser = Optional.of(user); 
      } 
      _systemUser = systemUser.get(); 
      return _systemUser; 
     } 
     CurrentUser userDetails = (CurrentUser) authentication.getPrincipal(); 
     return userDetails.getUser(); 
    } 
} 

的主应用程序类具有以下注释。

@ComponentScan 
@EnableAutoConfiguration(exclude = { MetricFilterAutoConfiguration.class, MetricRepositoryAutoConfiguration.class, SecurityAutoConfiguration.class }) 
public class Application { 
... 

回答

0

我不得不REQUIRES_NEW传播值来解决这个问题。它会创建新的事务并在存在的情况下挂起。不知道为什么默认传播不起作用。

@Transactional(propagation= Propagation.REQUIRES_NEW) 
@Component("auditorProvider") 
public class UserAuditorAware implements AuditorAware<User> { 

    @Inject 
    private UserRepository userRepository; 

    private User _systemUser; 

    @Override 
    public User getCurrentAuditor() { 
     Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
     if (authentication == null) { 
      if (_systemUser != null) { 
       return _systemUser; 
      } 
      Optional<User> systemUser = userRepository.findOneByUsername("system"); 
      if (!systemUser.isPresent()) { 
       // TODO: decide on which user to designate when entities are created by devices 
       User user = new User("system"); 
       user = userRepository.save(user); 
       userRepository.flush(); 
       systemUser = Optional.of(user); 
      } 
      _systemUser = systemUser.get(); 
      return _systemUser; 
     } 
     CurrentUser userDetails = (CurrentUser) authentication.getPrincipal(); 
     return userDetails.getUser(); 
    } 
} 
相关问题