Meu problema: Tenho um cadastro de cliente e assim que o cliente se cadastrar seja criada uma conta para este cliente. Não sei como faze-lo alguma sugestão seria bem vinda. Muito obrigado
cadastro-cliente.xhtml
<h:form><divclass="form-row"><divclass="form-group col-md-6"><labelfor="inputName">Nome</label><h:inputTextvalue="#{adminClientesBean.cliente.nome}"id="nome"type="text"class="form-control"a:autofocus="true"/></div><divclass="form-group col-md-6"><labelfor="inputLastName">Sobrenome</label><h:inputTextvalue="#{adminClientesBean.cliente.sobrenome}"id="sobrenome"type="text"class="form-control"/></div></div><divclass="form-row"><divclass="form-group col-md-6"><labelfor="inputEmail4">Email</label><h:inputTextvalue="#{adminClientesBean.cliente.email}"id="email"type="email"class="form-control"requiredMessage="Campo obrigatorio"/></div><divclass="form-group col-md-6"><labelfor="inputPassword4">Senha(6numeros)</label><h:inputSecretvalue="#{adminClientesBean.cliente.senha}"type="password"class="form-control"id="inputPassword4"placeholder="Escolha Senha de 6 numeros"/></div></div>
adminClientesBean
@ModelpublicclassAdminClientesBean{privateClientecliente=newCliente();@InjectprivateClienteDAOclienteDAO;@InjectprivateMessagesHelpermessagesHelper;privateList<Cliente>clientes;@TransactionalpublicStringsave(){clienteDAO.save(cliente);messagesHelper.addFlash(newFacesMessage("Cliente gravado com sucesso"));return"/site/conta-cliente?faces-redirect=true\"";}
Oi Darlan, eu esqueci de mencionar, criei uma classe service (ClienteService.java) para tratar essa abertura da conta assim que o cadastro do cliente fosse concluído. Mas não está funcionando não sei porque você poderia me ajudar? segue o arquivo:
Se você que está desenvolvendo e poderia debugar não sabe, quem dirá eu que estou há anos-luz de distância e sem nem saber se apresenta erro, exceção, se para, se pisca a tela, se dá tela azul da morte, kernel panic ou sei lá o que.
Esse “Não funciona” é genérico demais, precisa ser mais claro.
S
Sergio_Guerjik
Desculpe Darlan, realmente não consegui me expressar.
Quero dizer que quando executo o cadastro do cliente, nenhum erro aparece, o cliente é cadastrado, mas, na tabela cliente, o campo conta_id mostra null.
Na tabela “conta” nenhum do campos “id” “numero”(numero da conta) e “titular” (cliente) se preenchem automaticamente, ficam vazios, eu achei que criando um clienteService ele se preencheria automaticamente.
Obrigado.
M
Mike
Pelo que eu vi no seu código, você não cadastrou a conta em lugar nenhum.
OBS: Não sei se você sabe, mas a anotação @Model ela é de escopo request @RequestScoped e @Named ao mesmo tempo.
EDIT:
Vi agora que você deixou fixo a instanciaçao da classe Conta
Para salvar o cliente junto com a conta, de uma vez só, você deve definir o CascadeType do relacionamento, como por exemplo CascadeType.PERSIST
S
Sergio_Guerjik
Obrigado Mike, você poderia me explicar no meu código onde eu deixei fixo a instanciação da classe Conta? Seria no ClienteService?
Eu utilizaria o CascadeType.PERSIST no relacionamento cliente/conta nessa instanciação da classe Conta no clienteService?
G
guilhermebhte
Entendo que é esta a parte.
S
Sergio_Guerjik
Muito obrigado Guilherme pelo seu retorno, vou tentar implementar o CascadeType.PERSIST sugerido pelo Mike na classe ClienteService e postarei o resultado.
G
guilhermebhte
Sim, mas lembrando que tem que preencher o objeto Conta, para persistir junto.
S
Sergio_Guerjik
oi Guilherme fiz desta forma, mas quando você diz preencher o objeto Conta seria para definir um numero sequencial da conta e ligar ao cliente? Como posso fazer para conseguir isso? Me passe um exemplo por favor.
Entendo que você tem que preencher a conta e ela tem que estar registrado no banco, se possível fazer uma busca antes da conta.
Só isso, não funciona
Conta conta = new Conta(); cliente.setConta(conta);
Pois você está passando um objeto nulo.
S
Sergio_Guerjik
Oi Guilherme obrigado pelo retorno, você tem razão, isso mesmo, o melhor seria verificar se já existe uma conta cadastrada no BD, caso não, abrir uma, caso sim, avisar que este cliente já possui um cadastro e conta no sistema. O problema para mim, é que eu não sei e não entendo como fazer o cadastro do cliente, verificar se uma conta deste cliente já existe no BD e também ao mesmo tempo, cadastrar uma conta para esse cliente (tudo de uma vez, na hora do cadastramento do cliente). Não consigo enxergar como fazer isso. Já quebrei a cabeça aqui e não consigo um resultado somente null.
G
guilhermebhte
Como está preenchendo este cadastro de cliente ?
S
Sergio_Guerjik
Oi Guilherme com esse bean (e está funcionando direitinho menos é claro o campo (numero da conta):
@ModelpublicclassAdminClientesBean{privateClientecliente=newCliente();@InjectprivateClienteDAOclienteDAO;@InjectprivateMessagesHelpermessagesHelper;privateList<Cliente>clientes;@TransactionalpublicStringsave(){clienteDAO.save(cliente);messagesHelper.addFlash(newFacesMessage("Cliente gravado com sucesso"));return"/site/conta-cliente?faces-redirect=true\"";
}
e este cliente.java
@EntitypublicclassCliente{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;privateStringnome;privateStringsobrenome;@Email@NotBlank@Column(unique=true)privateStringemail;privateStringsenha;privateStringcpf;privateStringcep;privateStringendereco;privateStringnumero;privateStringbairro;privateStringcidade;privateStringestado;privateStringddd;privateStringcelular;@OneToMany(mappedBy="cliente")privateSet<NotaFiscal>notas;///@OneToOne//private Conta conta;privateContaconta=newConta();publicCliente(){}
G
guilhermebhte
A questão primeiro, como é a entrada destas informações ?
S
Sergio_Guerjik
Guilherme boa noite segue o cadastro-cliente.xhtml onde entram as informações:
@EntitypublicclassContaimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateIntegerid;privateStringtitular;privateStringnumero;@OneToMany(mappedBy="conta")privateList<Movimentacao>movimentacoes;publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}publicStringgetTitular(){returntitular;}publicvoidsetTitular(Stringtitular){this.titular=titular;}publicStringgetNumero(){returnnumero;}publicvoidsetNumero(Stringnumero){this.numero=numero;}publicList<Movimentacao>getMovimentacoes(){returnCollections.unmodifiableList(movimentacoes);}publicContabusca(IntegercontaId){// TODO Auto-generated method stubreturnnull;}}
@Entity@EntityListeners(MovimentacaoListener.class)publicclassMovimentacaoimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;@Temporal(TemporalType.TIMESTAMP)privateCalendardata;@ManyToOne@JoinColumn(name="conta_pk")privateContaconta;privateBigDecimalvalor;@Enumerated(EnumType.STRING)privateTipoMovimentacaotipoMovimentacao;publicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicTipoMovimentacaogetTipoMovimentacao(){returntipoMovimentacao;}publicvoidsetTipoMovimentacao(TipoMovimentacaotipoMovimentacao){this.tipoMovimentacao=tipoMovimentacao;}publicCalendargetData(){returndata;}publicvoidsetData(Calendardata){this.data=data;}publicContagetConta(){returnconta;}publicvoidsetConta(Contaconta){this.conta=conta;}publicBigDecimalgetValor(){returnvalor;}publicvoidsetValor(BigDecimalvalor){this.valor=valor;}@PrePersist@PreUpdatepublicvoidpreAltera(){System.out.println("Autalizando a data da movimentação");this.setData(Calendar.getInstance());}publicbooleanisValorNegativo(){// TODO Auto-generated method stubreturnfalse;}}
Estou falando no cadastro-cliente.xhtml. Se não tem como o usuário escolher uma conta, ela não vai ser salva no banco de dados.
S
Sergio_Guerjik
Oi Guilherme na minha idéia, a conta é aberta conjuntamente, ou melhor, através do preenchimento do cadastro do cliente, seria algo semelhante quando a gente ia na agencia do banco, preenchia o cadastro junto com o gerente (ele ia pedindo os dados) e quando o cadastro era concluído, o gerente já passava o numero da conta aberta sem a ação de escolha por parte do usuário ou dele, acredito que o sistema já retornava com o numero da conta aberta, como eu poderia fazer isso? Por isso eu pensei que não precisava incluir no cadastro-cliente a conta, e sim no cliente.java. para ser persistida juntamente com os dados do cliente de forma automatica. Mas não está dando certo.
G
guilhermebhte
Certo então cade os campos para o usuário digitar a conta neste xhtml ?