JTA EntityManager не может использовать getTransaction () - но только в контроллере - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь использовать репозиторий Spring Data JPA для получения и сохранения сущностей.Когда я использую этот репозиторий, например, в работе Quartz, все работает отлично.Когда я пытаюсь использовать этот репозиторий из RestController, я получаю следующее сообщение об ошибке: «JTA EntityManager не может использовать getTransaction ()».Конечно, я нашел решение, но кажется, что мой случай немного отличается от случаев, которые я нашел.Любые идеи, которые могут вызвать такого рода ошибки?

Пример класса обслуживания с использованием этого репо:

@Service
public class ServiceToTablesMappingServiceImpl implements ServiceToTablesMappingService {

  @Autowired
  private ServiceToTablesMappingRepository repo;

  /**
   * {@inheritDoc}
   */
  @Override
  public void createMapping(String serviceName, Set<String> tables) {

    for (String table : tables) {
      ServiceToTablesMappingEntity entity = new ServiceToTablesMappingEntity();
      entity.setServiceName(serviceName);
      entity.setTableName(table);
      this.repo.save(entity); //this line causes the error
    }
  }
...

Код моего репо:

import java.util.List;

import javax.transaction.Transactional;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import xxx.ServiceToTablesMappingEntity;

@Repository
public interface ServiceToTablesMappingRepository extends CrudRepository<ServiceToTablesMappingEntity, Long> {

  @Transactional
  List<ServiceToTablesMappingEntity> findByServiceName(String serviceName);
}

Код контроллера:

@RestController
public class InitialLoadController {
  ...  
  @Autowired
  private ServiceToTablesMappingService regService;

  /**
   * Triggers the initial load workflow preparation
   *
   * @param service The service which tries to prepare
   * @param request The request which contains a list of tables along with some other information about the subscriber
   * @return Return the 200 status code if everything went fine
   */
  @PostMapping("/init-prepare")
  public ResponseEntity<Void> initPrepare(@RequestBody InitialLoadRequestDto request) {

    // create mapping
    Set<String> tables = request.getTables();
    String service = request.getServiceName();
    this.regService.createMapping(service, tables);

   ...

    return ResponseEntity.ok().build();
  }
...

А вот как я настраиваю entityManager:

@Configuration
@DependsOn("transactionManager")
@ComponentScan({ "xxx", "yyy" })
@EnableJpaRepositories(basePackages = { "xxx",
"yyy" }, entityManagerFactoryRef = "datasupplyEntityManager", transactionManagerRef = "transactionManager", queryLookupStrategy = Key.CREATE_IF_NOT_FOUND)
@EnableConfigurationProperties(DbDatasourceProperties.class)
public class DatasupplyConfig {
...
@Bean(name = "datasupplyEntityManager")
  @DependsOn("jpaVendorAdapter")
  @Autowired
  public LocalContainerEntityManagerFactoryBean entityManagerFactory(JpaVendorAdapter jpaVendorAdapter,
      DataSource xaDataSource) {

    HashMap<String, Object> properties = new HashMap<>();
    properties.put("hibernate.transaction.jta.platform", AtomikosJtaPlatform.class.getName());
    properties.put("javax.persistence.transactionType", "JTA");
    properties.put("hibernate.temp.use_jdbc_metadata_defaults", this.useJdbcMetadataDefaults);

    LocalContainerEntityManagerFactoryBean entityManagerBean = new LocalContainerEntityManagerFactoryBean();
    entityManagerBean.setDataSource(xaDataSource);
    entityManagerBean.setJpaVendorAdapter(jpaVendorAdapter);
    entityManagerBean.setPackagesToScan("xxx",
        "yyyy");
    entityManagerBean.setJpaPropertyMap(properties);
    return entityManagerBean;
  }
...

1 Ответ

0 голосов
/ 16 октября 2018

Извините, мне потребовалось некоторое время, чтобы ответить.Я нашел проблему.Проблема заключалась в том, что https://stackoverflow.com/users/1126526/manish предложил: мне пришлось изменить источник данных на jtaDataSource.Я не знаю, почему я этого раньше не видел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...