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