JPA - Verwenden mehrerer Datenquellen zum Definieren der Zugriffssteuerung

Ich bin völlig neu bei JPA und JSF und hoffe, dass Sie mir bei meinen Fragen helfen können. Meine Anwendung wurde mit JSF 2.0 Framework erstellt und verwendet JPA 2.0 / EclipseLink, das unter Glassfish 3+, MySQL, ausgeführt wird.

Ich habe eine Persistenzeinheit namens "loginPU" unter Verwendung der Datenquelle festgelegt: "jdbc / loginDataSource" "jdbc / loginDataSource" verbindet sich mit MySQL unter Verwendung von "login1" (definiert inmysql.user Tabelle) und hat nur Zugriff aufcustomer.user undcustomer.roles Tabellen, mit nur ausgewählten Berechtigungen.

Ich habe in Glassfish JDBC Resources zwei weitere Datenquellen "jdbc / admin" und "jdbc / staff" mit unterschiedlichen Berechtigungen erstellt

Das Anmelde- / Authentifizierungsszenario ist:

Benutzeranmeldung mit formularbasierter Authentifizierung (Benutzername und Passwort)Erstellen Sie EntityManageFactory mit der Persistenzeinheit "loginPU" und "jdbc / loginDataSource".Erstellen Sie eine Abfrage, um die Benutzerrolle abzurufenWenn die Benutzerrolle admin ist, stellen Sie eine Verbindung mit der Datenquelle "jdbc / admin" herWenn die Benutzerrolle staff ist, stellen Sie eine Verbindung mit der Datenquelle "jdbc / staff" her

Mein Code für Punkt 2 oben sieht so aus:

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

Ich behalte sogar meine EntityManagerFactory in Sitzungsattributen und rufe sie in der JpaController-Klasse ab

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

Fragen: Wie kann ich Nummer 4 oder Nummer 5 erreichen? Ist das möglich zu tun? Ist es möglich, eine der beiden Datenquellen der Persistenz-Einheit "loginPU" zuzuweisen? Ich schaffe es, eine Verbindung mit loginPU und jdbc / loginDataSource herzustellen und dann eine Verbindung mit jdbc / admin datasource herzustellen, aber wenn ich auf andere Entitäten zugreife, wird der Fehler und die Standardeinstellung jdbc / loginDataSource ausgegeben

Hinweis: Ich verwende JpaController-Klassen, die von NetBeans erstellt wurden, sowie SessionBeans, um die Entitäten zu verwalten. Meine JpaController-Klassen verwenden

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

Meine Session-Beans sind alle @Stateless, ich habe versucht, @PersistenceContext mit UnitName und ohne UnitName zu verwenden, aber kein Glück

@PersistenceContext
private EntityManager em;

Ich habe versucht, in persistence.xml mehrere Persistenzeinheiten zu verwenden, in der Hoffnung, Benutzer mit dem Namen der Persistenzeinheit zu verbinden, der auf der Rolle basiert. Bei der Bereitstellung auf dem Server tritt jedoch ein Fehler auf.

ich lese überAnwendungsgesteuerte Persistenz undcontainergesteuertIch denke, was ich versuche zu erreichen, ist die Verwendung von anwendungsverwalteten, aber nicht sicher, wie es geht.

Ist es möglich, mehrere Datenquellen zu verwenden, wenn ich containergesteuerte Persistenz verwenden möchte? Jeder Vorschlag wird sehr geschätzt.

Vielen Dank für Kommentare oder Vorschläge im Voraus.

[Gelöst]

Zuerst habe ich meine persistence.xml wie folgt definiert:

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

Ich verwende in meinen Session-Beans weder @PersistenceUnit noch @PersistenceContext. (Ich verwende Netbeans und diese Beans wurden erstellt, als ich JSF-Seiten aus Entitätsklassen erstellte.)

In allen Session-Beans sehen sie folgendermaßen aus:

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

Das obige Anmeldeszenario (5 Elemente) wurde zu 7:

Benutzeranmeldung mit formularbasierter Authentifizierung (Benutzername und Passwort)Erstellen Sie EntityManageFactory mit der Persistenzeinheit "loginPU" und "jdbc / loginDataSource".Erstellen Sie eine Abfrage, um die Benutzerrolle abzurufenWenn die Benutzerrolle admin ist, stellen Sie eine Verbindung mit der Datenquelle "jdbc / admin" herWenn die Benutzerrolle staff ist, stellen Sie eine Verbindung mit der Datenquelle "jdbc / staff" her

Plus

Entfernen oder Löschen der in Element 2 erstellten EntityManagerFactory mit emf.close ();Lassen Sie die neue EntityManagerFactory in Element 4 oder 5 in HttpSession erstellt

Antworten auf die Frage(1)

Ihre Antwort auf die Frage