2015-08-15 23 views
6

Esiste un modo per ottenere un handle per EntityManager per un determinato oggetto entità? Sto usando Spring Boot 1.2.3 con avviamento JPA e sto ulteriormente configurando più fonti di dati con @configurationOttenere l'handle su EntityManager in Spring Boot

Ho controllato [resolved]SPRING BOOT access to entityManager e non sembra rispondere alla domanda.

Grazie.

EDIT: ho aggiunto la descrizione di come le mie fonti di dati sono definite:

@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(); 
    } 
} 

Nel mio application.yml ho le seguenti sezioni

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

Finora ho provato entrambi dei suggerimenti di @ Stephane ma ottengo NoSuchBeanDefinitionException

Diciamo che la mia entità si chiama Customer poi ho provato

@Service 
public class FooService { 

    private final EntityManager entityManager; 

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

} 

Ma ho anche provato

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

senza fortuna.

+1

È un po 'difficile da dire senza vedere come è stato configurato il database JPA. Normalmente dovresti essere in grado di usare '@ PersistenceContext' e sei a posto. Puoi mostrarci come hai configurato il tuo database? – Makoto

+0

Grazie, ho capito. Solo se si desidera un'origine dati diversa da quella primaria è necessario fornire un nomeunità. L'omissione del nome dell'unità ti consente di ottenere il gestore di entità principale che alla fine ha funzionato per il mio scopo. – pastafarian

risposta

8

Dipende da come sei stato configurando questo, ma hai provato a iniettare la EntityManager con un qualificatore che corrisponde alla fabbrica che lo ha creato?

Qui è a sample project with two data sources. Se si vuole iniettare il EntityManager per l'ordine, basta effettuare le seguenti operazioni, in ogni primavera fagiolo del progetto

@Service 
public class FooService { 

    private final EntityManager entityManager; 

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

} 

Per il cliente, utilizzare il customerEntityManager.

Naturalmente è possibile utilizzare il nome dell'unità persistenti, invece, che è

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

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

Verificare la configurazione del progetto per ulteriori dettagli.

+0

Grazie @ Stéphane. Nel caso di Spring-Boot in cui non sto definendo il persistence.xml, dove trovo il nome dell'unità di persistenza? Ho provato più ipotesi ma ottengo NoSuchBeanDefinitionException – pastafarian

+0

Sono confuso. Spring Boot non supporta la configurazione automatica per più gestori di entità, devi configurarlo tu stesso. Se hai più origini dati e una che è "@ Primaria", qual è la tua domanda esattamente? Boot verrà creato solo sul gestore di entità e quindi aggiungere '@ PersistenceContext' (o' @ Autowired') è tutto ciò che è necessario. –

+0

Sono sicuro che ci sia qualcosa che mi manca. Ad ogni modo ho aggiunto qualche dettaglio alla domanda su come creare le mie origini dati. Non so se questo aiuti. Grazie. – pastafarian