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