JPA - Korzystanie z wielu źródeł danych w celu zdefiniowania kontroli dostępu

Jestem całkowicie nowy w JPA i JSF i mam nadzieję, że pomożesz mi w moich pytaniach. Moja aplikacja jest zbudowana przy użyciu JSF 2.0 Framework, przy użyciu JPA 2.0 / EclipseLink działającego na Glassfish 3+, MySQL.

Ustawiłem jedną jednostkę trwałości o nazwie „loginPU” za pomocą źródła danych: „jdbc / loginDataSource” „jdbc / loginDataSource” łączy się z MySQL za pomocą „login1” (zdefiniowany wmysql.user stół) i ma tylko dostęp docustomer.user icustomer.roles tabele, z tylko wybranymi uprawnieniami.

Stworzyłem 2 inne źródła danych „jdbc / admin” i „jdbc / staff” w zasobach Glassfish JDBC i oba z różnymi uprawnieniami

Scenariusz logowania / uwierzytelniania to:

Logowanie użytkownika przy użyciu uwierzytelniania opartego na formularzu (nazwa użytkownika i hasło)Utwórz EntityManageFactory za pomocą jednostki trwałości „loginPU” i „jdbc / loginDataSource”utwórz zapytanie, aby pobrać rolę użytkownikajeśli rola użytkownika to admin, połącz się przy użyciu źródła danych „jdbc / admin”jeśli rolą użytkownika jest personel, połącz się przy użyciu źródła danych „jdbc / staff”

Mój kod dla pozycji 2 powyżej wygląda następująco:

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

Zachowuję nawet mój EntityManagerFactory w atrybutach sesji i pobieram go w klasie 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;
    }

Pytania: Jak mogę osiągnąć liczbę 4 lub liczbę 5? Czy to możliwe, aby to zrobić? Czy możliwe jest przypisanie źródła danych do jednostki trwałości „loginPU”? Udało mi się nawiązać połączenie przy użyciu loginPU i jdbc / loginDataSource, a następnie połączyć się przy użyciu źródła danych jdbc / admin, ale gdy uzyskuję dostęp do innych jednostek, zgłasza błąd i domyślnie jdbc / loginDataSource

Uwaga: Używam klas JpaController utworzonych przez netbeans, a także bean sesji do zarządzania encjami. Moje klasy JpaController używają

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

Wszystkie moje fasole sesyjne to @Stateless, próbowałem użyć @PersistenceContext z unitName i bez unitName, ale bez szczęścia

@PersistenceContext
private EntityManager em;

Próbowałem użyć wielu jednostek trwałości w pliku persistence.xml, mając nadzieję na połączenie użytkowników za pomocą nazwy jednostki trwałości w oparciu o rolę, ale daje mi to błąd podczas wdrażania na serwerze.

Czytałem otrwałość zarządzana przez aplikację izarządzane kontenerami, Myślę, że to, co próbuję osiągnąć, to wykorzystanie aplikacji zarządzanej, ale nie wiem, jak to zrobić.

Jeśli mam używać trwałości zarządzanej przez kontener, czy można użyć wielu źródeł danych? Wszelkie sugestie są bardzo mile widziane.

Dziękujemy za wszelkie uwagi lub sugestie z góry.

[ROZWIĄZANY]

Najpierw zdefiniowałem mój plik persistence.xml w następujący sposób:

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

Nie używam żadnych @PersistenceUnit ani @PersistenceContext w moich fasolach sesyjnych (używam Netbeans i te fasole zostały utworzone podczas tworzenia stron JSF z klas jednostek)

We wszystkich fasolach sesyjnych wyglądają tak:

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

Powyższy scenariusz logowania (5 elementów) stał się 7:

Logowanie użytkownika przy użyciu uwierzytelniania opartego na formularzu (nazwa użytkownika i hasło)Utwórz EntityManageFactory za pomocą jednostki trwałości „loginPU” i „jdbc / loginDataSource”utwórz zapytanie, aby pobrać rolę użytkownikajeśli rola użytkownika to admin, połącz się przy użyciu źródła danych „jdbc / admin”jeśli rolą użytkownika jest personel, połącz się przy użyciu źródła danych „jdbc / staff”

plus

usuń lub wyczyść EntityManagerFactory utworzony w pozycji 2 za pomocą emf.close ();Zachowaj nową EntityManagerFactory utworzoną w pozycji 4 lub 5 w HttpSession

questionAnswers(1)

yourAnswerToTheQuestion