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.
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.