Hibernate + múltiplas SessionFactories + múltiplos databases

2 respostas
A

Olá pessoal, tenho a seguinte situação:

Minha aplicação JSF + Hibernate precisa acessar vários databases do SQL Server. Até ai tudo bem, pois encontrei uma solução criando um arquivo *.cfg.xml para cada database. Ocorre que no pacote de classes corporativas, onde mantenho objetos de uso geral como Pessoa, Pessoa Física, Funcionários, Municípios, etc, tenho coleções mapeadas para objetos dependentes que estão em outro pacote e são carregadas em uma SessionFactory (database) diferente.

Minha implementação:

SessionFactory 1 <----> 1 Database

No meu HibernateUtil criei um Map<String, SessionFactory> e identifico a SessionFactory que mapeou a classe na inicialização do Hibernate.
Assim, o Hibernate encontra a SessionFactory (Database) corretamente e tudo bem !

Problema 1:

Preciso criar as anotações de coleções de objetos que estão em outro database (SessionFactory) e que ainda não foram mapeadas.
Quanto crio as anotações, o hibernate reclama que a classe dependente anotada não foi mapeada e não cria a SessionFactory.

Caso não seja anotada a coleção, o HibernateUtil resolve o nome do database (SessionFactory) e tudo funciona !

Problema 2:

Ao executar um HQL que utilize no join alguma tabela mapeada em outra Session o hibernate não executa porque naquela SessionFactory não existe o mapeamento para a classe que foi mapeada em outra SessionFactory (Database).

Gostaria da ajuda de vocês para implementar uma solução que permita:

1 - Criar todas as anotações nas classes, mesmo que a classe anotada esteja em uma SessionFactory (database) diferente;
2 - Executar de forma transparente os comandos HQL com join entre classes de SessionFactory (database) distintas;

O Hibernate permite esse tipo de implementação ? Como implementaria isso com o hibernate ?

Obrigado.

2 Respostas

H

Cara,se eu entendi corretamente,você está querendo utilizar diferentes conexões com um SGDB para se executar uma aplicação.Quer,também,que o Hibernate seja capaz de distinguir os mapeamentos entre as diferentes conexões.Além disso,na hora de fazer consultas ele deveria realiza-las em diferentes conexões,se necessário e juntar(join) os resultados.
Por fim,se você precisasse de uma transação,a transação seria realizada também nas duas conexões… isso eu acredito que seja inviável.
Sei que o Hibernate fornece bastante recursos,não vou lhe dar certeza,mas acredito que isso ele não faça não.
Uma outra evidência para isso é que o mapeamento não permite que você especifique a SessionFactory a qual o objeto do mapeamento se refere.
No máximo você pode dizer que uma tabela pertence a determinado esquema,não podendo refletir isso as colunas.

Uma Session(unidade de trabalho do hibernate),está vinculada a uma SessionFactory.

Espero ter ajudado.

A

Sim, entendeu perfeitamente a questão.

1 - Para mapear em schemas e\ou catálogos distintos eu utilizo a anotação @Table(schema=“dbo”, catalog=“corp”, name = “Colaborador”) - OK !

2 - Consegui também utilizar Bancos diferentes na mesma aplicação (SQL Server e MySQL) ao implementar no meu HibernateUtil o getsession(Class clazz) que identifica a SessionFactory que mantém o mapeamento da classe e cria uma nova session para as transações se for necessário. Nessa implementação, crio um *.cfg.xml para cada banco e carrego os mapeamentos para aquela conexão - OK !

3 - Problema ainda não resolvido:
Tenho tido problema com a deserialização dos objetos/relacionamentos que deixei sem anotação propositadamente para que permitisse a carga dos mapeamentos em cada SessionFactory criada. Funciona perfeitamente para os objetos que estão anotados, porém esses objetos não possuem vínculo direto com objetos do outro banco.

Entendo que isso seria um pouco complicado mesmo de controlar, a menos que o Hibernate fizesse algum tipo de merge de todas as SessionFactories ou permitisse a nomeação de cada Factory e utilização por exemplo em uma anotação do tipo @Table(schema=“dbo”, catalog=“corp”, name = “Colaborador”, Factory = “???”).

Seria como controlar todas as transações em todas as conexões criadas como se fosse uma única conexão.

Muito obrigado pela ajuda !

Criado 15 de outubro de 2010
Ultima resposta 16 de out. de 2010
Respostas 2
Participantes 2