JPA - Uso de múltiples fuentes de datos para definir el control de acceso

Soy totalmente nuevo en JPA y JSF y espero que pueda ayudarme con mis preguntas. Mi aplicación se ha creado utilizando el Framework JSF 2.0, utilizando JPA 2.0 / EclipseLink ejecutándose en Glassfish 3+, MySQL.

Configuré una unidad de persistencia llamada "loginPU" usando la fuente de datos: "jdbc / loginDataSource" "jdbc / loginDataSource" se conecta a MySQL usando "login1" (definido enmysql.user mesa) y solo tiene acceso acustomer.user ycustomer.roles Tablas, con solo seleccionar privilegios.

Creé otras 2 fuentes de datos "jdbc / admin" y "jdbc / staff" en Glassfish JDBC Resources y ambas con diferentes privilegios

El escenario de inicio de sesión / autenticación es:

Inicio de sesión del usuario mediante autenticación basada en formulario (nombre de usuario y contraseña)Cree EntityManageFactory utilizando la unidad de persistencia "loginPU" y "jdbc / loginDataSource"crear consulta para recuperar el rol del usuariosi el rol del usuario es admin, conecte usando la fuente de datos "jdbc / admin"Si el rol del usuario es personal, conéctese usando la fuente de datos "jdbc / staff"

Mi código para el artículo 2 anterior se ve así:

Map properties = new HashMap(); 
properties.put(TRANSACTION_TYPE, "JTA");

// Configure the internal EclipseLink connection pool
properties.put(JDBC_DRIVER, "com.mysql.jdbc.Driver");
properties.put(JDBC_URL, "jdbc:mysql://localhost:3306/customer");
properties.put(JDBC_USER, "login1");
properties.put(JDBC_PASSWORD, "login1");
properties.put(JTA_DATASOURCE, "jdbc/loginDataSource");

EntityManageFactory emf = Persistence.createEntityManagerFactory("loginPU",properties);

Incluso mantengo mi EntityManagerFactory en los atributos de sesión y lo recupero en la clase JpaController

//save into session
session.setAttribute("entityManagerFactory", emf);

//retrieved in JpaController
public EntityManagerFactory getEmf() {

        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        HttpSession s = request.getSession(true);
        try {
            emf = (EntityManagerFactory) s.getAttribute("entityManagerFactory");
        } catch(NullPointerException ne){
            System.out.println("EMF Exception: "+ne);
        }

        return emf;
    }

Preguntas: ¿Cómo puedo alcanzar el número 4 o el número 5? ¿Es eso posible hacer? ¿Es posible asignar cualquier fuente de datos a la unidad de persistencia "loginPU"? Logro establecer la conexión usando loginPU y jdbc / loginDataSource y luego me conecto usando jdbc / admin datasource, pero cuando accedo a otras entidades, produce errores y valores predeterminados a jdbc / loginDataSource

Nota: Estoy usando clases JpaController creadas por netbeans y también beans de sesión para administrar las entidades. Mis clases de JpaController usan

@Resource private UserTransaction utx;
@PersistenceUnit private EntityManagerFactory emf;

Todos mis beans de sesión son @Stateless, traté de usar @PersistenceContext con unitName y sin unitName pero sin suerte

@PersistenceContext
private EntityManager em;

Intenté usar varias unidades de persistencia en persistence.xml, con la esperanza de conectar a los usuarios usando el nombre de la unidad de persistencia en función del rol, pero me da un error al implementar en el servidor.

Yo leo sobrepersistencia gestionada por la aplicación ygestionado por contenedoresCreo que lo que estoy tratando de lograr es usar una aplicación administrada, pero no estoy seguro de cómo hacerlo.

Si debo usar la persistencia administrada por contenedor, ¿es posible usar múltiples fuentes de datos? Cualquier sugerencia sera grandemente apreciada.

Gracias por cualquier comentario o sugerencia de antemano.

[Solucionado]

Primero definí mi persistencia.xml de la siguiente manera:

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="mdbAdminPU" >
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/login</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
    </persistence-unit>
</persistence>

No uso ninguna @PersistenceUnit o @PersistenceContext en mis beans de sesión (estoy usando Netbeans y estos beans se crearon cuando creé páginas JSF a partir de clases de entidad)

En todos los beans de sesión, se ven así:

@Stateless
public class UserFacade extends AbstractFacade<User> {

    @Override
    protected EntityManager getEntityManager() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        EntityManagerFactory emf = (EntityManagerFactory) session.getAttribute("entityManagerFactory");
        EntityManager em = emf.createEntityManager(); 
        return em;
    }

    public UserFacade() {
        super(User.class);
    }
}

El escenario de inicio de sesión anterior (5 elementos) se ha convertido en 7:

Inicio de sesión del usuario mediante autenticación basada en formulario (nombre de usuario y contraseña)Cree EntityManageFactory utilizando la unidad de persistencia "loginPU" y "jdbc / loginDataSource"crear consulta para recuperar el rol del usuariosi el rol del usuario es admin, conecte usando la fuente de datos "jdbc / admin"Si el rol del usuario es personal, conéctese usando la fuente de datos "jdbc / staff"

más

elimine o borre el EntityManagerFactory creado en el artículo 2 usando emf.close ();Mantenga el nuevo EntityManagerFactory creado en el elemento 4 o 5 en HttpSession

Respuestas a la pregunta(1)

Su respuesta a la pregunta