Dúvida no relacionamento entre tabelas  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
Blitzcrank
What is classpath?

Membro desde: 30/01/2012 09:21:03
Mensagens: 5
Offline

Olá,

Eu vim do PHP e não tenho muita experiência com hibernate e estou com um problema no relacionamento entre tabelas,

Não posso mostrar as tabelas aqui da empresa então criei uma situação parecida com a daqui, a situação fictícia é um controle de consumo de créditos de ligações telefonicas de vários clientes:

Eu possuo a seguinte estrutura de banco de dados: (modelo1.png)



e criei as seguintes entidades:



As seguintes regras:
- Um cliente pode ter várias filiais.
- Um cliente matriz pode ter um ou vários contratos e as filiais herdam todos os contratos da matriz.
- Um cliente filial pode ter seu próprio contrato que não pode ser visto pela matriz.
- Um contrato deve definir a quantidade máxima de créditos que podem ser contratados por tipo de crédito, matriz e filial(filiais podem ter limite diferente da estabelecida pela matriz).
- O crédito pode ser transferido entre a filial e matriz, quando a matriz transfere créditos para uma filial, conta como se tivesse utilizado pela matriz.

Como deve ficar: (duvida.png)


Do jeito que esta funciona até certo ponto, pois não consigo trazer todos os clientes que utilizam o contrato 1 por exemplo, pois a tabela contrato não esta relacionada com os clientes filhos diretamente, somente pela tabela créditos. Não sei se a causa é falta de relacionamento bidirecional, mas deixo esta como última opção pois não sei o impacto de performance que isto causaria.

Acho que meu problema esta na abstração dos objetos, podem me ajudar?

De preferência preciso seguir esta estrutura de tabela, mas se não tiver jeito posso redesenha-los.

[Thumb - duvida.png]
 Nome do arquivo duvida.png [Disk] Download
 Descrição
 Tamanho 17 Kbytes
 Baixado:  3 vez(es)

[Thumb - modelo1.png]
 Nome do arquivo modelo1.png [Disk] Download
 Descrição
 Tamanho 19 Kbytes
 Baixado:  2 vez(es)

This message was edited 2 times. Last update was at 30/01/2012 11:28:57

drsmachado
GUJ Expert

Membro desde: 25/09/2010 12:54:06
Mensagens: 3986
Localização: Curitiba / São José dos Pinhais - PR
Offline

As imagens não abrem para todos.
Coloque como anexo.

Rumo aos 4000
"Os homens de verdade assumem suas responsabilidades e culpas. Esquivar-se e dar desculpas é atitude dos tolos, que preferem não se comprometer".

Lugar de perguntar é no fórum!
Não respondo via MP
Não respondo por Email
Não respondo por IM
Blitzcrank
What is classpath?

Membro desde: 30/01/2012 09:21:03
Mensagens: 5
Offline

drsmachado wrote:As imagens não abrem para todos.
Coloque como anexo.


Anexado, vlws.
Blitzcrank
What is classpath?

Membro desde: 30/01/2012 09:21:03
Mensagens: 5
Offline

Acho que eu tentei detalhar demais e acabei complicando.

Resumindo:

Um contrato tem um dono (matriz) esse contrato é compartilhado entre as filiais dela e os créditos deste contrato podem ser transferidas para as clientes das filiais.

Não consigo imaginar como fazer o relacionamento entre essas entidades.

Por exemplo, a matriz tem 10 creditos, e transfiro 5 para a filial.

Quando eu pego os creditos da matriz, é só eu executar:

contratoDao(cliente id matriz).getCreditos();

mas não consigo obter os creditos da filha:

contratoDao(cliente id filho).getCreditos();

pois não há um relacionamento direto.

Alguém pode me ajudar?

Obrigado.
calel
JavaTeenager

Membro desde: 27/08/2009 14:33:17
Mensagens: 157
Offline

Não lembro exatamente como resolver isso com annotations, mas com HQL ficaria mais ou menos assim:



Dessa forma você teria todos os créditos de certo contrato, a partir daí é só acrescentar mais filtros para chegar no nivél de detalhe que você quiser.

Code Reverse

"Contra a estupidez os próprios deuses lutam em vão." - Friedrich Von Schiller
How To Answer A Question on the Internet
Blitzcrank
What is classpath?

Membro desde: 30/01/2012 09:21:03
Mensagens: 5
Offline

Com HQL eu consigo trazer, mas por exemplo:

Eu tenho uma pagina de clientes, contratos e créditos.

Para verificar os créditos de um determinado cliente, eu abro a página de clientes, e será mostrado uma página de contratos deste cliente (se for cliente filho será mostrado os contratos do pai também) e na página de contratos eu mostro os créditos deste contrato.

Então se eu passo, na url (estou usando spring): cliente/1/contrato/1.html

Na página de contratos eu quero mostrar os dados do contrato e os créditos:

Então terei que fazer?
Contrato contrato = contratoDao.find(1);
List<Credito> creditos = creditoDao.findByContratoCliente(1,2);

Será que não tem um jeito de relacionar eles pra fazer tipo?
Contrato contrato = contratoDao.find(1);
List<Credito> creditos = contrato.getCliente(2).getCredito();

This message was edited 3 times. Last update was at 01/02/2012 06:03:45

calel
JavaTeenager

Membro desde: 27/08/2009 14:33:17
Mensagens: 157
Offline

Acredito que seja a maneira mais facil através do DAO.

Ou você poderia criar uma relação inversa, onde o cliente tem uma lista de contratos ou creditos...
Daí você precisaria dar uma lida nas anotações @OneToMany e @ManyToOne e o parametro mappedBy

This message was edited 3 times. Last update was at 01/02/2012 07:12:57


Code Reverse

"Contra a estupidez os próprios deuses lutam em vão." - Friedrich Von Schiller
How To Answer A Question on the Internet
Blitzcrank
What is classpath?

Membro desde: 30/01/2012 09:21:03
Mensagens: 5
Offline

calel wrote:Acredito que seja a maneira mais facil através do DAO.

Ou você poderia criar uma relação inversa, onde o cliente tem uma lista de contratos ou creditos...
Daí você precisaria dar uma lida nas anotações @OneToMany e @ManyToOne e o parametro mappedBy


Cael,

Usei a sugestão do HQL que você tinha falado, mas como estou usando critéria eu joguei a mesma coisa só que no critéria.

A Única coisa que eu achei "feio" é na página de contrato do clientefilho tenho que fazer:

modelMap.addAttribute("cliente", clienteDao.find(clienteId));
modelMap.addAttribute("contrato", contratoDao.find(contratoId));

pra criar um link do tipo cliente/(id da empresa)/contrato/(id do contrato). Se eu tivesse usado contrato.getCliente().getId() ele traria o ID do pai e não do filho já que o contrato só se relaciona com o pai.

acho que ficaria melhor:

contrato = contratoDao.find(contratoid);
modelMap.addAttribute("cliente", contrato.getCliente());
modelMap.addAttribute("contrato", contrato.getCreditos());

Mas acho que não da por causa da estrutura das tabelas, pois n tenho uma tabela intermediária tipo ClienteContrato.
Esse negócio de compartilhar contratos entre matriz e filial é muito complicado, ou eu que estou complicando...

Valeus pela ajuda.

This message was edited 1 time. Last update was at 01/02/2012 12:18:56

 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team