JPA - Usando várias fontes de dados para definir o controle de acesso

Eu sou totalmente novo no JPA e no JSF e espero que você possa me ajudar com minhas perguntas. Meu aplicativo é construído usando o JSF 2.0 Framework, usando o JPA 2.0 / EclipseLink em execução no Glassfish 3+, MySQL.

Eu defino uma unidade de persistência chamada "loginPU" usando a fonte de dados: "jdbc / loginDataSource" "jdbc / loginDataSource" conecta-se ao MySQL usando "login1" (definido emmysql.user tabela) e só tem acesso acustomer.user ecustomer.roles tabelas, com apenas alguns privilégios.

Eu criei 2 outras fontes de dados "jdbc / admin" e "jdbc / staff" no Glassfish JDBC Resources e ambos com diferentes privilégios

O cenário de login / autenticação é:

Login de usuário usando autenticação baseada em formulário (nome de usuário e senha)Crie EntityManageFactory usando a unidade de persistência "loginPU" e "jdbc / loginDataSource"criar consulta para recuperar a função do usuáriose a função do usuário for admin, conecte-se usando a origem de dados "jdbc / admin"se a função do usuário for pessoal, conecte-se usando a origem de dados "jdbc / staff"

Meu código para o item 2 acima é assim:

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

Eu mesmo manter meu EntityManagerFactory em atributos de sessão e recuperá-lo na classe 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;
    }

Perguntas: Como posso alcançar o número 4 ou o número 5? Isso é possível? É possível atribuir uma fonte de dados à unidade de persistência "loginPU"? Eu consigo estabelecer conexão usando loginPU e jdbc / loginDataSource e, em seguida, conecto usando jdbc / admin datasource, mas quando eu acesso outras entidades, ele gera erro e padrão para jdbc / loginDataSource

Nota: Estou usando as classes JpaController criadas pelo netbeans e também os beans de sessão para gerenciar as entidades. Minhas classes JpaController usam

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

Meus beans de sessão são todos @Stateless, tentei usar @PersistenceContext com unitName e sem unitName, mas sem sorte

@PersistenceContext
private EntityManager em;

Eu tentei usar várias unidades de persistência em persistence.xml, na esperança de conectar os usuários usando o nome da unidade de persistência com base na função, mas isso me dá um erro ao implantar no servidor.

eu leio sobrepersistência gerenciada pelo aplicativo egerenciado por contêinerEu acho que o que eu estou tentando alcançar é usar gerenciados por aplicativos, mas não sei como fazer isso.

Se eu quiser usar persistência gerenciada por contêiner, é possível usar várias fontes de dados? Qualquer sugestão é muito apreciada.

Obrigado por quaisquer comentários ou sugestões com antecedência.

[RESOLVIDO]

Primeiro defini meu persistence.xml da seguinte forma:

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

Eu não uso @PersistenceUnit ou @PersistenceContext em meus beans de sessão (estou usando o Netbeans e esses beans foram criados quando eu criei páginas JSF de classes de entidade)

Em todos os beans de sessão, eles se parecem com isso:

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

O cenário de login acima (5 itens) se tornou 7:

Login de usuário usando autenticação baseada em formulário (nome de usuário e senha)Crie EntityManageFactory usando a unidade de persistência "loginPU" e "jdbc / loginDataSource"criar consulta para recuperar a função do usuáriose a função do usuário for admin, conecte-se usando a origem de dados "jdbc / admin"se a função do usuário for pessoal, conecte-se usando a origem de dados "jdbc / staff"

mais

remova ou desmarque EntityManagerFactory criado no item 2 usando emf.close ();Manter novo EntityManagerFactory criado no item 4 ou 5 no HttpSession

questionAnswers(1)

yourAnswerToTheQuestion