Pessoal,
Estou desenvolvendo uma aplicação que utiliza o legado da empresa, e precisarei acessar duas bases de dados.
Conforme sugere a documentação do hibernate, estou utilizando HibernateUtil para adquirir uma nova sessão e um filtro para interceptar toda a requisição ao servidor.
A questão é, dependendo do bean que estou acessando precisou conectar a base de dados correta.
Depois de uma semana de pesquisa cheguei a conclusão que preciso de dois SessionFactory, um para cada configuração.
Tentei utilizar um filtro parametrizável para adquirir a sessão correta, mas ainda não consegui fazer o rebuild da session conforme minha necessidade.
Pelo que li a respeito precisarei implementar a interface Interceptor para tal, mas sinceramente não consegui realizar com sucesso.
Alguém poderia me ajudar?? Segue abaixo o código do meu HibernateUtil e do Filtro
public class HibernateUtil {
private static final SessionFactory sessionFactorySuporte;
private static final SessionFactory sessionFactoryBaan;
private static ThreadLocal<Session> sessions = new ThreadLocal<Session>();
static {
try {
sessionFactoryBaan = new AnnotationConfiguration().configure(
"hibernate.baan.cfg.xml").buildSessionFactory();
sessionFactorySuporte = new AnnotationConfiguration().configure(
"hibernate.suporte.cfg.xml").buildSessionFactory();
} catch (Throwable ex) {
System.out.println("Falha na criação da SessionFactory" + ex);
throw new ExceptionInInitializerError(ex);
}
}
/**
* Abre uma nova sessão ou retorna a sessão corrente
*
* @return Session: corrente
* @param bd:
* int indicando de qual SessionFactory a session deve ser
* retornada, sendo:
* 1 - Base Suporte (SQL Server)
* 2 - Base BaaN (Oracle)
*/
public static Session openSession(int bd) {
switch (bd) {
case 1:
sessions.set(sessionFactorySuporte.openSession());
break;
case 2:
sessions.set(sessionFactoryBaan.openSession());
break;
}
return sessions.get();
}
/**
* Fecha a sessão corrente
*/
public static void closeCurrentsession() {
sessions.get().close();
sessions.set(null);
}
/**
* Retorna a sessão corrente
*
* @return Session: Sessão corrente
*/
public static Session currentSession() {
return sessions.get();
}
}
public class HibernateSessionFilter implements Filter {
private static Log log = LogFactory.getLog(HibernateSessionFilter.class);
@SuppressWarnings("unchecked")
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// Verifica a SessionFactory necessária para requisição
HttpServletRequest httpReq = (HttpServletRequest) request;
String url = httpReq.getRequestURL().toString();
int base = 1;
if (url.toLowerCase().contains("/suporte/")) base = 1;
if (url.toLowerCase().contains("/baan/")) base = 2;
try {
log.debug("Iniciando Transação");
System.out.println("Factory: " + base);
HibernateUtil.openSession(base);
HibernateUtil.currentSession().beginTransaction();
// Chama próximo filtro (continua processando requisição
chain.doFilter(request, response);
// Comita transação
log.debug("Comitando transação na base de dados");
HibernateUtil.currentSession().getTransaction().commit();
} catch (StaleObjectStateException staleEx) {
throw staleEx;
} catch (Throwable ex) {
// Somente rollback
ex.printStackTrace();
try {
if (HibernateUtil.currentSession().getTransaction().isActive()) {
log.debug("Tentando rollblack após exceção");
HibernateUtil.currentSession().getTransaction().rollback();
}
} catch (Throwable rbEx) {
log.error("Não foi possível efetuar rollback", rbEx);
}
throw new ServletException(ex);
}
}
public void init(FilterConfig filterConfig) throws ServletException {
}
public void destroy() {
}
}