JPA - Использование нескольких источников данных для определения контроля доступа

Я совершенно новичок в JPA и JSF и надеюсь, что вы можете помочь мне с моими вопросами. Мое приложение построено с использованием JSF 2.0 Framework, с использованием JPA 2.0 / EclipseLink, работающего на Glassfish 3+, MySQL.

Я установил один постоянный модуль под названием «loginPU» используя источник данных: & quot; jdbc / loginDataSource & quot; & Quot; JDBC / loginDataSource & Quot; подключается к MySQL, используя & quot; login1 & quot; (определено вmysql.user таблица) и имеет доступ только кcustomer.user а такжеcustomer.roles таблицы, только с избранными привилегиями.

Я создал 2 других источника данных & quot; jdbc / admin & quot; и & quot; jdbc / staff & quot; в Glassfish JDBC Resources и оба с разными привилегиями

Сценарий входа в систему / аутентификации:

User login using form based authentication (username and password) Create EntityManageFactory using persistence unit "loginPU" and "jdbc/loginDataSource" create query to retrieve user role if user role is admin, connect using "jdbc/admin" data source if user role is staff, connect using "jdbc/staff" data source

Мой код для пункта 2 выше выглядит так:

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

Я даже храню свой EntityManagerFactory в атрибутах сеанса и извлекаю его в классе 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;
    }

Questions: How can I achieve number 4 or number 5? Is that possible to do? Is it possible to assign either data source to "loginPU" persistence unit? I manage to establish connection using loginPU and jdbc/loginDataSource and then connect using jdbc/admin datasource, but when I access other entities, it throws error and default to jdbc/loginDataSource

Замечания: Я использую классы JpaController, созданные netbeans, а также сессионные компоненты для управления объектами. Мои классы JpaController используют

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

Все мои сессионные компоненты - @Stateless, я пытался использовать @PersistenceContext с unitName и без unitName, но безуспешно

@PersistenceContext
private EntityManager em;

Я попытался использовать несколько модулей персистентности в файле persistence.xml, надеясь соединить пользователей, используя имя модуля персистентности в зависимости от роли, но при развертывании на сервере выдает ошибку.

Я читаю опостоянство, управляемое приложением а такжеуправляемое контейнеромЯ думаю, что я пытаюсь достичь, это использовать приложение под управлением, но не знаю, как это сделать.

Если я хочу использовать постоянство, управляемое контейнером, возможно ли использовать несколько источников данных? Любое предложение с благодарностью.

Спасибо за любые комментарии или предложения заранее.

[SOLVED]

First I defined my persistence.xml as follows:

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

I don't use any @PersistenceUnit or @PersistenceContext in my session beans.(I'm using Netbeans and these beans were created when I created JSF Pages from Entity Classes)

In all session beans, they look like this:

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

The login scenario above (5 items) has become 7:

User login using form based authentication (username and password) Create EntityManageFactory using persistence unit "loginPU" and "jdbc/loginDataSource" create query to retrieve user role if user role is admin, connect using "jdbc/admin" data source if user role is staff, connect using "jdbc/staff" data source

плюс

remove or clear EntityManagerFactory created in item 2 using emf.close(); Keep new EntityManagerFactory created in either item 4 or 5 in HttpSession