web-dev-qa-db-fra.com

Obtention du descripteur pour EntityManager dans Spring Boot

Existe-t-il un moyen d'obtenir un handle vers EntityManager pour un objet entité donné? J'utilise Spring Boot 1.2.3 avec JPA Starter et je configure en outre explicitement plusieurs sources de données avec @configuration

J'ai vérifié [résolu] accès SPRING BOOT à entityManager et il ne semble pas répondre à la question.

Merci.

EDIT: J'ai ajouté une description de la façon dont mes sources de données sont définies:

@Component
@Configuration
public class DataSources {
    @Bean
    @Primary
    @ConfigurationProperties(prefix="first.datasource")
    public DataSource getPrimaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix="second.datasource")
    public DataSource getSecondDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix="third.final.datasource")
    public DataSource getThirdFinalDataSource() {
        return DataSourceBuilder.create().build();
    }
}

Dans mon application.yml, j'ai les sections suivantes

first.datasource:
  name: 'first_datasource',
  #other attributes...
second.datasource:
  name: 'second_datasource',
  #other attributes...
third.final.datasource:
  name: 'first_datasource',
  #other attributes...

Jusqu'à présent, j'ai essayé les deux suggestions de @ Stephane mais j'obtiens NoSuchBeanDefinitionException

Disons que mon entité s'appelle Customer puis j'ai essayé

@Service
public class FooService {

    private final EntityManager entityManager;

    @Autowired
    public FooService(@Qualifier("customerEntityManager") EntityManager entityManager) {
        ...
    }

}

Mais j'ai aussi essayé

@PersistenceContext(unitName = "customer") // also tried "customers" and "first_datasource"
private EntityManager entityManager;

sans chance.

13
pastafarian

Cela dépend de la façon dont vous avez configuré cela, mais avez-vous essayé d'injecter le EntityManager avec un qualificatif qui correspond à l'usine qui a créé il?

Voici n exemple de projet avec deux sources de données . Si vous souhaitez injecter le EntityManager pour la commande, procédez comme suit dans n'importe quel bean Spring du projet

@Service
public class FooService {

    private final EntityManager entityManager;

    @Autowired
    public FooService(@Qualifier("orderEntityManager") EntityManager entityManager) {
        ...
    }

}

Pour le client, utilisez le customerEntityManager.

Bien sûr, vous pouvez utiliser le nom d'unité persistant à la place, c'est-à-dire

@PersistenceContext(unitName = "customers")
private EntityManager entityManager;

@PersistenceContext(unitName = "orders")
private EntityManager entityManager;

Vérifiez la configuration du projet pour plus de détails.

19
Stephane Nicoll