Hibernate - Integrando sistemas feitos com Hibernate

Olá, estamos com o seguinte problema:
estamos desenvolvendo um ERP composto por diversos modulos, sendo que nem todos acessam o mesmo banco de dados.

Cada um destes módulos é armazenado no seu próprio arquivo JAR, que contém também os arquivos de configuração do Hibernate.
Individualmente, os modulos trabalham perfeitamente, a dúvida aparece quando queremos criar algum modulo usando classes pertencentes a outros modulos.

Exemplo:
suponhamos que tenhamos um modulo só para cadastro de fornecedores, e dentro do qual tenhamos mapeada uma classe chamada Fornecedor com o seguinte mapeamento e que acessa o banco de dados fictício “fornecedores”:

  <class name="moduloFornecedores.Fornecedor" table="fornecedores">
       <id name="id" column="id">
             <generator class="increment"/>
       </id>
       <property name="nome" column="nome"/>
  </class>

E tenhamos um outro módulo responsável pela cotação de preços e que necessite usar a classe “Fornecedor”, do pacote “moduloFornecedores” do modulo de cadastro de fornecedores mas que use o banco de dados “cotações”.

Se ambos acessassem o mesmo banco de dados, e compartilhassem as mesmas configurações do Hibernate, o mapeamento seria simplíssimo. Seria algo como:

  <class name="moduloCotacao.Cotacao" table="Cotacao">
       <id name="id" column="id">
             <generator class="increment"/>
       </id>
       <property name="nome" column="nome"/>
       <many-to-one
            name="fornecedor"
            column="IdFornecedor"
            class="moduloFornecedores.Fornecedor"
            not-null="true"
            lazy="false"/>
  </class>

No entanto, os dois modulos não compartilham as mesmas configurações, e muito menos os bancos de dados (apesar de podermos criar os relacionamentos entre os bancos sem problemas usando as ferramentas de administração dos mesmos). Como devemos proceder? É possível fazer isto? Como? Posso configurar o Hibernate para usar as configurações de outra aplicação? Posso ter mais de um SessionFactory? Caso sim, como faço para referenciar diferentes objetos do tipo SessionFactory e, assim, resolver este problema?

Ninguém?

Melhorando a pergunta: como eu faço para configurar multiplas instâncias de um objeto SessionFactory e, se possível, como faço para interagir entre as mesmas?

Cara,

Isto é muito comum qdo se tem uma arquitetura baseada em componentes.
O mais correto seria você criar componentes por domínio.

Tipo você cria um componente para o domínio Cliente que possui os mapeamentos para as tabelas cliente, endereco, contato, empresa.

Aí vc tem outro domínio, tipo pedidos, que tem as tabelas pedido, pagamento, produto e etc.

Como vc integra isso ?!?

Você monta estes dois componentes cada 1 no seu .jar com seus respectivos mapeamentos e seu hibernate.cfg.xml.

Quando vc for implementar sua camada DAO, que será necessária qdo se tem esse tipo de integração, vc ao invés de trafegar os orm’s que são os objetos de relacionamento do modelo de dados ( suas classes mapeadas no xml ), vc sempre popula um VO e passa esses caras …

Desta forma, vc sempre terá nos seus daos, métodos que recebem um VO e devolvem outro VO.

Trabalho aqui na empresa com uma arquitetura baseada em componentes, e isso funciona perfeitamente. Os ORM’s são usados somente dentro da camada DAO, e assim ficando mto mais fácil de se trabalhar com essa arquitetura.

Se tiver dúvidas a respeito, posso entrar mais no detalhe …

Abraço

Oi Marcio,
na realidade, é exatamente isto que estou fazendo.
Estou desenvolvendo várias aplicações separadas, cuja lógica de negócio é colocada em seus respectivos arquivos jar, que, tal como você mesmo citou, funcionam como componentes no final das contas.

Estou mantendo o ORM somente na camada DAO também, tal como você citou. O problema ocorre quando vou fazer o relacionamento entre os dois domínios.
Por exemplo, no caso em que você citou, em que há dois domínios: pedidos e clientes.
Todo pedido é o pedido de um cliente correto?
Pois bem, como eu mapearia um pedido que referenciasse um cliente?
Como eu poderia fazer buscas de pedidos, por exemplo, em que todos os clientes tivessem um nome começado com A?

Oi,

Eu acho que o exemplo que usei qto a pedido e cliente não foi mto feliz, pois, na minha opinião, estas 2 entidades devem pertencer ao mesmo domínio de negócio.
Existem mtas vantagens em se trabalhar em um ambiente componentizado, e algumas desvantagens.

Imagino que falando do exemplo infeliz que usei, se vc quisesse todos os pedidos dos clientes que começam com a letra “A”, vc teria de no domínio do cliente, selecionar todos os clientes com a inicial “A”, o qual te retornaria todos estes clientes, e em uma iteração desta lista, setar no objeto pedido, os códigos do cliente, que analisando este dominio, seria somente um atributo Integer ou Long e não o objeto Cliente. Desta forma, a cada pedido setado o código do cliente, poderia ser carregado.

Não sou o dono da verdade, e o que foi mencionado aqui, com certeza funcionaria mto bem, mas pode também não ser a melhor forma de se fazer. Este é um ponto que deve ser analisado com carinho ao se definir uma arquitetura.

Abraço,