Problemas Corporativos

Pessoal,

gostaria de saber como vocês lidam com o seguinte problema corporativo:

Onde eu trabalho, existe um único SGBD e schema para TODAS as aplicações desenvolvidas.

Como consequência da base de dados centralizada e compartilhada por todas as aplicações, existem algumas entidades que são realmente utilizadas por várias aplicações, ou seja, são de fato corporativas. Um exemplo seria a entidade PessoaFisica.

Logo, exemplificando, no contexto do sistema XPTO, foram criados relacionamentos na entidade PessoaFisica que apenas fazem sentido para esse contexto. No contexto do sistema Foo, a mesma coisa aconteceu. Foram criados relacionamentos de entidades desse dominio com PessoaFisica.

O resultado é que hoje há uma dependencia implícita das classes do sistema XPTO, com algumas classes do sistema Foo, por conta dessa entidade comum - PessoaFisica.

Estamos querendo modularizar a camada de domínio, que hoje é um projeto só (e imenso), de tal forma que as dependências hoje existentes sejam minimizadas, mas estamos nos deparando com algumas questões de complexidade acidental.

Inicialmente, pensamos em criar uma herança de PessoaFisica para cada um dos contextos. O problema é que não é possível mapear (estamos usando Hibernate), via herança, a entidade pai e a entidade filha para a mesma tabela (essa entidade PessoaFisica está mapeada para uma tabela no SGBD com o mesmo nome e contém todas as constraints e relacionamentos necessários para todos os sistemas que a manipulam).

Enfim, tenho certeza que esse problema corporativo não deve ser novidade, mas infelizmente conheço poucas pessoas que já passaram por uma situação parecida para trocar experiências.

O que vocês sugerem?

Quais?

É possível implementar mapeamentos que representa herança utilizando uma única tabela através de uma coluna identificadora.
EX: dá uma olhada no tutorial do hibernate.

Talvez se vc incluir um post com um código exemplo melhore o nosso entendimento.

flws

Fala marcosurata,

Sugiro que antes de mais nada você faça um levantamento dos teus domínios. Identifique as dependências entre eles. Por exemplo, o domínio ‘financeiro’ precisa do dominio ‘vendas’ e ‘vendas’ depende do domínio ‘pessoas’. Com isso você divide em módulos diferentes que se relacionam (sugiro que use Maven, ele facilita este trabalho).

Já sobre esquemas diferentes, não vejo problemas em usar, se para você vai ficar melhor organizado. E que eu saiba, herança funciona tranquilo desta forma também. A minha opinião é que eu acho desnecessário fazer isso.

Ainda sobre a divisão do projeto em submódulos, acho bacana, fica bem organizado. Só que a complexidade vai aumentar, referências circulares podem acontecer, classes em lugares errados, etc. Veja bem se vale a pena, se o projeto é grande o suficiente para fazer isso. Caso divida desta forma, conheça bem os domínios e seus relacionamentos antes de dividi-los

Quais?

É possível implementar mapeamentos que representa herança utilizando uma única tabela através de uma coluna identificadora.
EX: dá uma olhada no tutorial do hibernate.

Talvez se vc incluir um post com um código exemplo melhore o nosso entendimento.

flws
[/quote]

O problema é que mesmo essa estratégia de se criar um discriminator não iria funcionar, tendo em vista que a classe PessoaFisica já é uma joined-subclass de uma outra classe (e tabela no banco de dados) chamada Pessoa. Já olhei a documentação do hibernate e vi que não é possível mapear parte de uma cadeia de herança com joined-subclass (uma tabela para cada elemento da hierarquia) e a outra parte como subclass (uma tabela para todos os elementos da hierarquia).

Um outro problema é com relação aos hibernate.cfg.xml. Hoje, como todas as classes do domínio estão em um único projeto, existe um único cfg.xml.

Quando formos separar o as entidades do domínio por módulos, com certeza surgirão entidades que serão compartilhadas por vários módulos, como o exemplo citado (PessoaFisica). Nesse cenário cada módulo teria o seu dominio.cfg.xml + comum.cfg.xml.

É possível ter 2 arquivos cfg.xml, mas de tal forma que a exista uma única session factory contendo os mapeamentos de ambos os cfg.xml ?

[quote=pozzo]Fala marcosurata,

Sugiro que antes de mais nada você faça um levantamento dos teus domínios. Identifique as dependências entre eles. Por exemplo, o domínio ‘financeiro’ precisa do dominio ‘vendas’ e ‘vendas’ depende do domínio ‘pessoas’. Com isso você divide em módulos diferentes que se relacionam (sugiro que use Maven, ele facilita este trabalho).

Já sobre esquemas diferentes, não vejo problemas em usar, se para você vai ficar melhor organizado. E que eu saiba, herança funciona tranquilo desta forma também. A minha opinião é que eu acho desnecessário fazer isso.

Ainda sobre a divisão do projeto em submódulos, acho bacana, fica bem organizado. Só que a complexidade vai aumentar, referências circulares podem acontecer, classes em lugares errados, etc. Veja bem se vale a pena, se o projeto é grande o suficiente para fazer isso. Caso divida desta forma, conheça bem os domínios e seus relacionamentos antes de dividi-los[/quote]

Pozzo,

esse levantamento está sendo feito e o que foi constatado é que devido ao fato de existirem muitas entidades que são utilizadas por vários domínios, há muita dependência implicita entre conceitos de domínios diferentes, pois são adicionados relacionamentos nessas entidades comuns que são específicos de alguns domínios.

O Maven nesse caso só vai me ajudar a estruturar e gerenciar mais facilmente cada um desses módulos (que irão virar projetos separados). O problema é que primeiro eu preciso conseguir separá-los. :slight_smile: