Carregar dados de uma outra entidade sem FK de ligação

7 respostas
Norivan

Pessoal sou novato em desenvolvimento Java, estou criando uma tela de registro de chamados, nesta tela eu preciso trazer uma informação do contrato do cliente que está em uma entidade diferente (Contrato) apos o usuário selecionar o cliente na tela. Só que eu não tenho FK de ligação da tabela de registro de chamados para tabela de contratos, logo a ligação seria algo do tipo:

getCliente(idCliente).getContrato(idContrato).dataInicio

O problema é que eu não tenho ideia de que método eu tenho que implementar no OcorrenciaController Para fazer isso, algum bom samaritano pode me auxiliar?

Tentei assim:

xhtml

<h:outputText value="#{registroOcorrenciaController.contrato.dataInicio}"></h:outputText>

OcorenciaController

Contrato contrato;

Mas não apareceu dado nenhum porque não tenho os dados do contrato carregado.

7 Respostas

nel

Oi…

Você precisa ter uma referência no objeto Cliente para o contrato. Na realidade, na minha opinião, na sua tabela do banco de dados é obrigatório que tenha uma ligação de 1 - N de Cliente com Contrato, afinal, haverá contrato sem cliente? Não. Um contrato é único, ele pertence somente a um cliente, todavia, esse cliente pode possuir n contratos alocados a si, o que seria uma lista.

De qualquer forma, você deve pegar alguma informação do cliente e com esta informação fazer a busca no banco de dados, retornar, preencher o objeto Contrato e finalizar o método. Assim, as informações vão aparecer em tela.

drsmachado

Bom, primeiro, você está falando em orientação a objetos ou modelagem relacional? FK é um conceito de modelagem relacional, que veio a ser aplicado (e ainda é utilizado, graças a Deus, em bancos de dados). Quando você fala em OO, precisa deixar a FK de lado.

Em uma das duas classes, seja Cliente ou Contrato, há a necessidade de colocar uma variável que identifique a qual cliente o contrato em questão se refere.
Em modelagem relacional, Contrato teria uma FK de Cliente, o que me leva a crer, que um Cliente pode ter vários contratos, mas cada contrato pertence a apenas um cliente (relacionamento 1 : N).
Em OO não existe essa FK, quando temos relacionamento entre classes, ele é feito em nível de objetos.
No teu caso específico, cada cliente, além dos atributos e métodos inerentes à esta classe (nome, documento, endereço, telefone, etc) terá uma referência aos contratos que possui. Como cada cliente pode ter mais de um contrato, cada Cliente conterá, como variável, uma coleção (ou array) de contratos.

Isso me leva a concluir que, um cliente poderia ser representado assim:

public class Cliente{
//outros atributos
public List<Contrato> listaDeContratos = new ArrayList<Contrato>();
//métodos
}

A partir disto, você pode implementar um método em cliente que, dado o id do contrato, retorne o objeto contrato relativo ao id informado.

Entendeu?

hugo.hlcxcx

drsmachado:
Bom, primeiro, você está falando em orientação a objetos ou modelagem relacional? FK é um conceito de modelagem relacional, que veio a ser aplicado (e ainda é utilizado, graças a Deus, em bancos de dados). Quando você fala em OO, precisa deixar a FK de lado.

Em uma das duas classes, seja Cliente ou Contrato, há a necessidade de colocar uma variável que identifique a qual cliente o contrato em questão se refere.
Em modelagem relacional, Contrato teria uma FK de Cliente, o que me leva a crer, que um Cliente pode ter vários contratos, mas cada contrato pertence a apenas um cliente (relacionamento 1 : N).
Em OO não existe essa FK, quando temos relacionamento entre classes, ele é feito em nível de objetos.
No teu caso específico, cada cliente, além dos atributos e métodos inerentes à esta classe (nome, documento, endereço, telefone, etc) terá uma referência aos contratos que possui. Como cada cliente pode ter mais de um contrato, cada Cliente conterá, como variável, uma coleção (ou array) de contratos.

Isso me leva a concluir que, um cliente poderia ser representado assim:

public class Cliente{
//outros atributos
public List<Contrato> listaDeContratos = new ArrayList<Contrato>();
//métodos
}

A partir disto, você pode implementar um método em cliente que, dado o id do contrato, retorne o objeto contrato relativo ao id informado.

Entendeu?

Aproveitando a oportunidade, como eu faria pra adicionar os contratos do cliente e salvá-los no banco ?

Norivan

Pessoal não é bem isto, a entidade Cliente POSSUI um Contrato já, que me retorna um ArrayList e etc etc.
Estamos falando da tela REGISTRO DE CHAMADOS que tem uma entidade chamada CHAMADOS.

Está entidade CHAMADOS não possui um Cliente, possui um SOLICITANTE, pois o chamado pode ser aberto também por um Fornecedor ou Funcionario.
Ou seja eu não tenho uma ligação direta entre a entidade Chamados e a Contrato, mas preciso capturar um dado da entidade Contrato a partir da tela de chamados.

Tenho o id do cliente nesta tela, tenho que criar um campo também onde ele seleciona o contrato e depois disso mostra o dado que eu quero.

Ai que está o problema, eu simplesmente não sei como fazer esse metodo para resgatar a id do contrato e carregar os dados.
Se fosse em PHP eu resgataria a ID do contrato com um POST e daria um select sql na base para pegar os dados do contrato neste método, mas em Java faço o que?

nel

Então tu tem que criar uma relação entre solicitante e contrato.
A questão é que você tem de analisar a necessidade do teu sistema e montar o MER dele. Você precisa ter alguma referência, seja ela qual for, pois caso contrário, tu nunca vai chegar ao contrato específico.

drsmachado

hugo.hlcxcx:
drsmachado:
Bom, primeiro, você está falando em orientação a objetos ou modelagem relacional? FK é um conceito de modelagem relacional, que veio a ser aplicado (e ainda é utilizado, graças a Deus, em bancos de dados). Quando você fala em OO, precisa deixar a FK de lado.

Em uma das duas classes, seja Cliente ou Contrato, há a necessidade de colocar uma variável que identifique a qual cliente o contrato em questão se refere.
Em modelagem relacional, Contrato teria uma FK de Cliente, o que me leva a crer, que um Cliente pode ter vários contratos, mas cada contrato pertence a apenas um cliente (relacionamento 1 : N).
Em OO não existe essa FK, quando temos relacionamento entre classes, ele é feito em nível de objetos.
No teu caso específico, cada cliente, além dos atributos e métodos inerentes à esta classe (nome, documento, endereço, telefone, etc) terá uma referência aos contratos que possui. Como cada cliente pode ter mais de um contrato, cada Cliente conterá, como variável, uma coleção (ou array) de contratos.

Isso me leva a concluir que, um cliente poderia ser representado assim:

public class Cliente{
//outros atributos
public List<Contrato> listaDeContratos = new ArrayList<Contrato>();
//métodos
}

A partir disto, você pode implementar um método em cliente que, dado o id do contrato, retorne o objeto contrato relativo ao id informado.

Entendeu?

Aproveitando a oportunidade, como eu faria pra adicionar os contratos do cliente e salvá-los no banco ?

Neste caso, hugo, precisamos ver o sistema em duas dimensões, primeiro, a modelagem OO, onde um Cliente possui um Array de Contratos (com zero, um ou vários contratos).
A outra dimensão é a parte relacional, banco de dados, onde, aí sim, um cliente terá uma PK que será colocada na tabela Contrato, como sendo a FK. Toda vez que um Contrato for adicionado, se a regra de negócios assim definir, a FK deverá relacionar um cliente existente (é possível criar FK nula, por isso depende da regra do negócio).

Cada dimensão é tratada de forma específica, pois uma classe não precisa ser, necessariamente, uma tabela, nem uma tabela pode ser apenas uma classe.

drsmachado

Norivan:
Pessoal não é bem isto, a entidade Cliente POSSUI um Contrato já, que me retorna um ArrayList e etc etc.
Estamos falando da tela REGISTRO DE CHAMADOS que tem uma entidade chamada CHAMADOS.

Está entidade CHAMADOS não possui um Cliente, possui um SOLICITANTE, pois o chamado pode ser aberto também por um Fornecedor ou Funcionario.
Ou seja eu não tenho uma ligação direta entre a entidade Chamados e a Contrato, mas preciso capturar um dado da entidade Contrato a partir da tela de chamados.

Tenho o id do cliente nesta tela, tenho que criar um campo também onde ele seleciona o contrato e depois disso mostra o dado que eu quero.

Ai que está o problema, eu simplesmente não sei como fazer esse metodo para resgatar a id do contrato e carregar os dados.
Se fosse em PHP eu resgataria a ID do contrato com um POST e daria um select sql na base para pegar os dados do contrato neste método, mas em Java faço o que?

Tanto em PHP quanto em Java, você pode trabalhar da mesma maneira.
Quando o solicitante (que pode não ser o cliente) instancia o objeto Chamado, este irá, em algum momento, solicitar um atributo id, do objeto Contrato para seguir com o que a regra de negócios exige, certo?
Seja na página inicial do chamado ou em qualquer outro lugar, você pode colocar a solicitação do id do contrato, faz a requisição via post ou get ou ajax e retorna os dados do cliente ao qual este contrato está relacionado.

Da mesma forma, o chamado irá conter um atributo contrato e um atributo cliente.

Entendido?

Criado 21 de setembro de 2011
Ultima resposta 21 de set. de 2011
Respostas 7
Participantes 4