2012-01-09 13 views
10

in fondo, quello che voglio fare è assegnare l'attributo 'unitName' di @PersistenceContext con un valore che mi metterò dalla sessione in fase di esecuzione.dinamica attributo @PersistenceContext unitName per il contenitore a base di EntityManager

in dettaglio;

la mia applicazione sarà un'applicazione SaaS e avrò DB separati per ogni inquilino diverso. sto usando Glassfishv3 e gestisco le entità basate su container quindi non ottengo alcuna istanza da EntityManagerFactory esplicitamente. Tutto quello che sto facendo per creare un gestore di entità è;

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

necessario passare attributo unitName secondo l'utente corrente. non dovrebbe essere hard-coded.

Ho aggiornato EclipseLink 2.3, ma tutti gli esempi sono la creazione di un'istanza da EMF che è possibile passare Carta come

Map memberProps = new HashMap(); 
memberProps.put("memberPu1", props1); 
memberProps.put("memberPu2", props2); 

Map props = new HashMap(); 
props.put("eclipselink.jdbc.exclusive-connection.mode", "Always"); 
props.put("eclipselink.composite-unit.properties", memberProps); 

EntityManager em = emf.createEntityManager(props); 

improbabile nella mia app, contenitore fa quel lavoro quindi non sono essere in grado di fare questo

EntityManager em = emf.createEntityManager(props); 

Anche se ho tutte le unità di persistenza e le classi nella mia persistence.xml utilizzando definizioni JNDI, non sto potendo t o dire application server che DB (unità di persistenza) dovrebbe utilizzare al momento

qualsiasi aiuto sarebbe apprezzato

+0

Questa domanda mi aiuta a trovare una soluzione per un caso simile. I thik può essere utilizzato: http://stackoverflow.com/questions/5104185/how-to-inject-persistence-context-to-different-data-source-programmatically – Monnie

risposta

9

Valori in annotazioni non può essere assegnato in fase di esecuzione, e quindi sarà necessario trovare una strategia in cui è possibile creare più PersistenceContext s. Se puoi usare CDI, probabilmente ti semplificherà la vita.

Con CDI si potrebbe essere in grado di creare un produttore come segue:

public class EntityManagerProducer { 

    @PersistenceContext(unitName="firstUnit") private EntityManager firstEntityManager; 
    @PersistenceContext(unitName="secondUnit") private EntityManager secondEntityManager; 

    @Produces 
    public EntityManager getEntityManager(InjectionPoint injectionPoint) { 
    if(<your_first_criteria>) { 
     return firstEntityManager; 
    } else if (<your_second_criteria>) { 
     return secondEntityManager; 
    } 
    } 

Quindi è possibile utilizzare il metodo produttore a esempio il tuo DAO:

@Inject private EntityManager entityManager; 

EDIT: Io probabilmente consigliamo di utilizzare un'annotazione @Qualifier quanto rende chiaro dove stanno producendo il EntityManager da.

+0

chiunque desideri aggiornare il codice di esempio con '@ Qualificatore usato? –

1

È necessario utilizzare un'unità di persistenza gestita dall'applicazione, non dal contenitore.

cioè Persistence.createEntityManagerFactory()

È comunque possibile utilizzare JTA, non solo l'iniezione.

+0

mi è sembrato così ma a quel punto dovrò occuparmi di tutto il ciclo di vita della transazione nella mia app che non è stata progettata in quel modo. sembra che non ci sia modo di fornire configurazioni in fase di esecuzione e lasciare le altre operazioni al server delle applicazioni, ma grazie per la risposta –