| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/01/2012 10:15:46
|
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.
|
| Nome do arquivo |
duvida.png |
Download
|
| Descrição |
|
| Tamanho |
17 Kbytes
|
| Baixado: |
3 vez(es) |
|
| Nome do arquivo |
modelo1.png |
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
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/01/2012 10:53:18
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/01/2012 11:28:24
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/01/2012 14:07:20
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/01/2012 21:01:18
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/02/2012 06:00:29
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/02/2012 06:58:54
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/02/2012 12:15:14
|
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
|
|
|
 |
|
|