2012-01-09 37 views
10

básicamente, lo que quiero hacer es asignar el atributo 'unitName' de @PersistenceContext con un valor que voy a obtener de la sesión en tiempo de ejecución.dinámica atributo @PersistenceContext unitName de EntityManager basada en contenedores

en detalles;

mi aplicación será una aplicación SaaS y tendré bases de datos separadas para cada inquilino diferente. Estoy utilizando Glassfishv3 y la gestión de las entidades basado en contenedores por lo que no obtengo ninguna instancia de EntityManagerFactory explícitamente. Todo lo que estoy haciendo para crear un administrador de entidades es;

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

Necesito pasar el atributo unitName según el usuario actual. no debería estar codificado.

He actualizado EclipseLink 2.3, pero todos los ejemplos son la creación de una instancia de EMF que puede pasar Mapa propiedad como

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); 

poco probable en mi aplicación, contenedor hace ese trabajo por lo que no estoy siendo capaz de hacer esto

EntityManager em = emf.createEntityManager(props); 

aunque tengo todas las unidades de persistencia y clases en mi persistence.xml mediante el uso de las definiciones JNDI, no estoy siendo capaz de t O decirle servidor de aplicaciones, que DB (unidad de persistencia) se debe utilizar en el momento

cualquier ayuda se agradece

+0

Esta pregunta me ayudó a encontrar una solución para un caso similar. Creo que puede ser util: http://stackoverflow.com/questions/5104185/how-to-inject-persistence-context-to-different-data-source-programmatically – Monnie

Respuesta

9

Valores de anotaciones no puede ser asignado en tiempo de ejecución, y por lo tanto tendrá que encontrar una estrategia donde se puede crear múltiples PersistenceContext s. Si puede usar CDI, probablemente le hará la vida más fácil.

con CDI que podría ser capaz de crear un productor de la siguiente manera:

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; 
    } 
    } 

continuación, puede utilizar el método del productor en el ejemplo su DAO:

@Inject private EntityManager entityManager; 

EDIT: probablemente recomendaría usar una anotación @Qualifier ya que hace más claro dónde estás recibiendo el EntityManager partir.

+0

Cualquier persona dispuesta a actualizar el código de muestra con '@ Calificador' ¿usado? –

1

Necesita utilizar una unidad de persistencia administrada por la aplicación, no un contenedor.

decir Persistence.createEntityManagerFactory()

Puede seguir utilizando JTA, pero no la inyección.

+0

me pareció algo así, pero en ese momento tendré que ocuparme de todas las transacciones del ciclo de vida de mi aplicación que no fue diseñada de esa manera. parece que no hay forma de suministrar configuraciones en tiempo de ejecución y dejar las otras operaciones al servidor de aplicaciones, pero gracias por la respuesta –

Cuestiones relacionadas