Ajuda com código - criação de método

Java

21/05/2016

Olá pessoal!

Estou implementado uma aplicação web, mas sou novata em Java e estou tendo dificuldades em criar um determinado método. A aplicação permite criar seguros para um cliente. Terminada a validade do seguro, o mesmo pode ser renovado para mais um ano. Para isso, o método "renovar" precisa alterar o status do seguro em questão de "Aberto" para "Encerrado" e adicionar um novo registro com o tipo de proposta "Renovação" e um novo período de vigência. Quando um seguro é cadastrado pela primeira vez, seu tipo de proposta é "Seguro Novo". Toda vez que o cliente desejar renovar o seguro, um novo registro deve ser acrescentado com o tipo de proposta "Renovação" e uma nova validade.

Minha intenção é criar um botão "Renovar" na página de consulta de seguros para que o método seja executado automaticamente, adicionando um novo registro à lista de seguros, sem que o usuário tenha que acessar a página de cadastro do seguro para alterar o tipo de proposta e o período de vigência manualmente. No momento, o que eu consegui fazer foi apenas substituir o tipo de proposta e o status do segur, sem adicionar um novo registro e manter o anterior. O escopo do bean é "Request". Será que alguém poderia me dar uma ajuda nisso?

Obrigada.

Segue código:

SeguroRN
public String salvar(Seguro s) {
	Integer codigo = s.getCodigo();
        String tipoproposta = s.getTipoproposta().getDescricao();
	if (codigo == null || codigo == 0) {
            this.seguroDao.salvar(s);
	}        
        if (codigo != 0 && tipoproposta.contains("Renovação")) {
            this.seguroDao.salvar(s);
	} else {
            this.seguroDao.atualizar(s);
        }
        return null;
    }


SeguroBean
public void renovar() {
        this.seguro.setStatus("Encerrado");
        this.seguro.setTipoproposta(TipoProposta.Renovacao);
        SeguroRN seguroRN = new SeguroRN();
        seguroRN.salvar(this.seguro);
    }    
Sgrandini

Sgrandini

Curtidas 0

Respostas

Renan Di

Renan Di

21/05/2016

Eu imagino que a sua classe seguro deve ter um Id e quando você altera o Status para Encerrado no método você está fazendo isso no this ou seja no mesmo seguro que você já tinha e se você estiver usando JPA ou qualquer coisa do tipo quando você usa o método salvar provavelmente ele verifica que já existe um registro com aquele número no banco de dados e ao invés de inserir ele atualiza o registro por isso você não consegue criar o segundo registro, a forma de você fazer isso seria no método renovar você instanciar um novo objeto seguro e copiar os atributos do primeiro, deixando Id como null e o status como encerrado, ai depois então passar ele para o método salvar.
GOSTEI 0
Sgrandini

Sgrandini

21/05/2016

Olá Renan! Obrigada por responder.

Eu até consegui fazer com que fosse verificado se o Id já existe ou não, acrescentando a condição "tipoproposta.contains("Renovação")" para que fosse feita a inserção de um novo registro ao invés de apenas atualizar o já existente. Isso está no método salvar da classe SeguroRN que eu postei acima. O problema é que, para que essas duas condições fossem aceitas e o método "salvar" (e não o "atualizar") fosse chamado, tive que primeiro setar o tipo da proposta para "Renovação" no método "renovar" do bean. Aí é que está o meu erro, pois do jeito que coloquei o atributo "tipo de proposta" deixa de ser "Seguro Novo" para ser substituído por "Renovação", e não é isso que eu quero. Quero manter como "Seguro Novo", alterar apenas o status para "Encerrado" e aí sim inserir um novo registro como "Renovação" e status "Aberto", além de colocar um novo período de vigência.

Entendi a sua sugestão. Só não sei como implementar o que você disse, ou seja, copiar os atributos do primeiro, deixando o Id nulo e o status como "Encerrado" e então passar pra ele o método "salvar". Também não estou conseguindo inserir um novo período de vigência adicionando um ano. Sei que não deve ser algo difícil de fazer, mas como estou começando a programar em Java estou tendo essa dificuldade toda.
GOSTEI 0
Renan Di

Renan Di

21/05/2016

Blz acho que agora dá pra te ajudar de uma forma mais clara.
O que eu quis dizer com copiar foi o seguinte, o seu objeto que precisa ser alterado como você já sabe deve ser substituído por outro com os mesmos atributos daí você só precisa fazer o seguinte:

Crie um novo objeto chamando o construtor padrão sem atributos, neste novo objeto set todos os atributos recuperados do primeiro objeto não esquecendo de quando recuperar o vencimento antigo substituir ou calcular você que sabe, o novo vencimento, não dar um Id ou gerar um novo id diferente do anterior e no objeto antigo mudar o status para encerrado e colocar no novo o status para Renovação, basicamente é isso.

Objeto novo = new Objeto();
novo.setAtributo1 = velho.getAtributo1;
novo.setAtributo2 = velho.getAtributo2;
e etc...
novo,setId = gerar id como você achar melhor, ou até mesmo deixar o BD gerar pra você passando null aqui;
velho.setStatus = "Encerrado";
novo.setStatus = "Renocação";

Acho que agora você deve entender melhor o passo a passo, basicamente o problema ai está mesmo é na modelagem, desculpa por ter colocado tudo como Objeto pois não lembrei o nome da sua class na hora de escreve rsrsrs. Se tiver mais dúvidas pode continuar perguntando.
GOSTEI 0
Sgrandini

Sgrandini

21/05/2016

Renan, funcionou. Mas tenho uma dúvida: como ficaria o método se a classe possuísse muitos atributos? No meu caso, a classe "Seguro" tem poucos. Então, não houve problema em fazer dessa forma. Mas se a classe tivesse muitos atributos, o método ficaria enorme. Não existe uma maneira de carregar todos os dados de seguro, sem que tenha que atribuir o valor do atributo "velho" para o atributo "novo" um a um?

Outra coisa, não sei se é por causa do escopo (Request) que estou utilizando no bean, mas depois do método "renovar" ser executado a página "consulta de seguros" não é atualizada com o novo registro. Preciso dar um F5 para o registro aparecer. Como faço pra resolver isso?

Obrigada.
GOSTEI 0
Renan Di

Renan Di

21/05/2016

Se a classe possuísse muitos atributos você poderia utilizar Reflection para ler todos os métodos e chamá-los fazendo assim com que o seu código atribuísse para você todos os valores, ou algum método como clone() que te retorna uma instância idêntica a do objeto mas não a mesma assim você pode mudar os atributos que quiser sem alterar nos dois ao mesmo tempo.

Método clone em Java
Reflection em Java

public void renovar() {
        this.seguro.setStatus("Encerrado");
        this.seguro.setTipoproposta(TipoProposta.Renovacao);
        SeguroRN seguroRN = new SeguroRN();
        seguroRN.salvar(this.seguro);
    } 


Dentro do seu método existe a chamada this.seguro logo você tem um atributo da classe do tipo seguro, e é diretamente dele que você preenche os campos na tela, após o método salvar o seu atributo de class seguro continua apontando pra o seguro velho e deveria receber agora a instância do novo seguro para ter seus valores atualizados, além de salvar a alteração feita no seguro antigo:
this.seguro.salvar(this.segur);
this.seguro = seguroRN;
this.seguro.salvar(this.segur);



Ou seja, você deve salvar os dois para alteração ter efeito no banco e depois trocar as instâncias velha pela nova para a alteração ter efeito na tela. Espero que faça sentido na sua classe já que desconheço a implementação mas acho que faz sentido pelo que você me disse.
GOSTEI 0
POSTAR