Cadastro de cliente cria Conta

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>

				<div class="form-row">
					<div class="form-group col-md-6">
						<label for="inputName">Nome</label>
						<h:inputText value="#{adminClientesBean.cliente.nome}" id="nome"
							type="text" class="form-control" a:autofocus="true" />
					</div>
					<div class="form-group col-md-6">
						<label for="inputLastName">Sobrenome</label>
						<h:inputText value="#{adminClientesBean.cliente.sobrenome}"
							id="sobrenome" type="text" class="form-control" />
					</div>
				</div>

				<div class="form-row">
					<div class="form-group col-md-6">
						<label for="inputEmail4">Email</label>
						<h:inputText value="#{adminClientesBean.cliente.email}"
							id="email" type="email" class="form-control"
							requiredMessage="Campo obrigatorio" />

					</div>
					<div class="form-group col-md-6">
						<label for="inputPassword4">Senha (6 numeros)</label>
						<h:inputSecret value="#{adminClientesBean.cliente.senha}"
							type="password" class="form-control" id="inputPassword4"
							placeholder="Escolha Senha de 6 numeros" />
					</div>
				</div>

adminClientesBean

          @Model
public class AdminClientesBean {

private Cliente cliente = new Cliente();
@Inject
private ClienteDAO clienteDAO;
@Inject
private MessagesHelper messagesHelper;
private List<Cliente> clientes;

@Transactional
public String save(){
	
	clienteDAO.save(cliente);
	
	messagesHelper.addFlash(
			new FacesMessage("Cliente gravado com sucesso"));
	return "/site/conta-cliente?faces-redirect=true\"";
	
}

cliente.java

   @Entity
    public class Cliente {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;		
private String nome;	
private String sobrenome;
@Email
@NotBlank
@Column(unique=true)
private String email;
private String senha;	

  @OneToOne
private Conta conta;


public Cliente() {
}

clienteDAO

public class ClienteDAO implements Serializable{	

private static final long serialVersionUID = 1L;

@PersistenceContext
private EntityManager manager;

public void save(Cliente cliente) {
	manager.persist(cliente);
}

public ClienteDAO(){

}

public ClienteDAO(EntityManager manager) {
	super();
	this.manager = manager;
}

conta.java

@Entity
public class Conta implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

private String titular;

private String numero;

  @OneToMany(mappedBy = "conta")
private List<Movimentacao> movimentacoes;
Conta conta = new Conta();

Isso não funciona?

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:

 public class ClienteService {

 ClienteDAO clienteDAO;	

 
public void cadastrar(Cliente cliente) {
    Conta conta = new Conta();
    cliente.setConta(conta);
   
	clienteDAO.save(cliente);
}

}

Ah, cara,

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.

1 curtida

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.

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

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?

Entendo que é esta a parte.

Muito obrigado Guilherme pelo seu retorno, vou tentar implementar o CascadeType.PERSIST sugerido pelo Mike na classe ClienteService e postarei o resultado.

Sim, mas lembrando que tem que preencher o objeto Conta, para persistir junto.

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.

 public class ClienteService {

 ClienteDAO clienteDAO;	

 @OneToMany(cascade=CascadeType.PERSIST, mappedBy="cliente")
public void cadastrar(Cliente cliente) {
	
    Conta conta = new Conta();
    
    cliente.setConta(conta);
   
	clienteDAO.save(cliente);
}

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.

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.

Como está preenchendo este cadastro de cliente ?

Oi Guilherme com esse bean (e está funcionando direitinho menos é claro o campo (numero da conta):

   @Model
    public class AdminClientesBean {
  private Cliente cliente = new Cliente();
 @Inject
 private ClienteDAO clienteDAO;
 @Inject
 private MessagesHelper messagesHelper;
 private List<Cliente> clientes;

 @Transactional
 public String save(){

clienteDAO.save(cliente);

messagesHelper.addFlash(
		new FacesMessage("Cliente gravado com sucesso"));
return "/site/conta-cliente?faces-redirect=true\"";

}

e este cliente.java

@Entity
public class Cliente {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;		
private String nome;	
private String sobrenome;
@Email
@NotBlank
@Column(unique=true)
private String email;
private String senha;	
private String cpf;	
private String cep;	
private String endereco;	
private String numero;	
private String bairro;	
private String cidade;	
private String estado;
private String ddd;	
private String celular;

@OneToMany(mappedBy="cliente")
private Set<NotaFiscal> notas;

///@OneToOne
//private Conta conta;

private Conta conta = new Conta();

public Cliente() {
}

A questão primeiro, como é a entrada destas informações ?

Guilherme boa noite segue o cadastro-cliente.xhtml onde entram as informações:

cadastro-cliente.xhtml

<h:form>

				<div class="form-row">
					<div class="form-group col-md-6">
						<label for="inputName">Nome</label>
						<h:inputText value="#{adminClientesBean.cliente.nome}" id="nome"
							type="text" class="form-control" a:autofocus="true" />
					</div>
					<div class="form-group col-md-6">
						<label for="inputLastName">Sobrenome</label>
						<h:inputText value="#{adminClientesBean.cliente.sobrenome}"
							id="sobrenome" type="text" class="form-control" />
					</div>
				</div>

				<div class="form-row">
					<div class="form-group col-md-6">
						<label for="inputEmail4">Email</label>
						<h:inputText value="#{adminClientesBean.cliente.email}"
							id="email" type="email" class="form-control"
							requiredMessage="Campo obrigatorio" />

					</div>
					<div class="form-group col-md-6">
						<label for="inputPassword4">Senha (6 numeros)</label>
						<h:inputSecret value="#{adminClientesBean.cliente.senha}"
							type="password" class="form-control" id="inputPassword4"
							placeholder="Escolha Senha de 6 numeros" />
					</div>
				</div>

				<div class="form-row">

					<div class="form-group col-md-6">
						<label for="inputCpf">CPF</label>
						<h:inputText value="#{adminClientesBean.cliente.cpf}" type="text"
							class="form-control" id="cpf" placeholder="só numeros" />
					</div>


					<div class="form-group col-md-6">
						<label for="inputZip">Cep</label>
						<h:inputText value="#{adminClientesBean.cliente.cep}" type="text"
							class="form-control" id="cep" placeholder="só numeros" />
					</div>

				</div>


				<div class="form-group">
					<label for="inputAddress">Endereço</label>
					<h:inputText value="#{adminClientesBean.cliente.endereco}"
						type="text" class="form-control" id="endereco" />
				</div>

				<div class="form-row">
					<div class="form-group col-md-3">
						<label for="inputAddress2">Numero</label>
						<h:inputText value="#{adminClientesBean.cliente.numero}"
							type="text" class="form-control" id="numero" />
					</div>

					<div class="form-group col-md-6">
						<label for="inputCity">Bairro</label>
						<h:inputText value="#{adminClientesBean.cliente.bairro}"
							type="text" class="form-control" id="bairro" />
					</div>
					<div class="form-group col-md-3">
						<label for="inputState">Cidade</label>
						<h:inputText value="#{adminClientesBean.cliente.cidade}"
							type="text" class="form-control" id="cidade" />
					</div>
				</div>

				<div class="form-row">
					<div class="form-group col-md-3">
						<label for="inputAddress2">Estado</label>
						<h:inputText value="#{adminClientesBean.cliente.estado}"
							type="text" class="form-control" id="estado" />
					</div>

					<div class="form-group col-md-3">
						<label for="inputState">Ddd</label>
						<h:inputText value="#{adminClientesBean.cliente.ddd}" type="text"
							class="form-control" id="ddd" />
					</div>

					<div class="form-group col-md-6">
						<label for="inputCity">Celular</label>
						<h:inputText value="#{adminClientesBean.cliente.celular}"
							type="text" class="form-control" id="celular" />
					</div>

				</div>


				<h:commandButton value="Cadastrar" class="btn btn-primary"
					action="#{adminClientesBean.save}"></h:commandButton>


			</h:form>
		</div>
	</div>
</div>

Cade a lista de contas ?

Oi Guilherme segue:

Conta.java

        @Entity
   public class Conta implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

private String titular;

private String numero;

@OneToMany(mappedBy = "conta")
private List<Movimentacao> movimentacoes;
public Integer getId() {
	return id;
}

public void setId(Integer id) {
	this.id = id;
}

public String getTitular() {
	return titular;
}

public void setTitular(String titular) {
	this.titular = titular;
}

public String getNumero() {
	return numero;
}

public void setNumero(String numero) {
	this.numero = numero;
}

public List<Movimentacao> getMovimentacoes() {
	return Collections.unmodifiableList(movimentacoes);
}

public Conta busca(Integer contaId) {
	// TODO Auto-generated method stub
	return null;
}


}

ContaDAO

@Stateless
public class ContaDAO {

@PersistenceContext
private EntityManager manager;

public void adiciona(Conta conta) {
	manager.persist(conta);
	}

public List<Conta> lista() {
	CriteriaQuery<Conta> query = manager.getCriteriaBuilder().createQuery(Conta.class);
			query.select(query.from(Conta.class));
			
			List<Conta> lista = manager.createQuery(query).getResultList();
			
			return lista;
}

public void remove(Conta conta) {
	manager.remove(manager.merge(conta));
	}

public Conta busca(Long id) {
	Conta conta = manager.find(Conta.class, id);
	return conta;
	}


public void altera(Conta conta) {
	manager.merge(conta);
	
	
	}

}

ContasBean.java

@Model
 public class ContasBean {

private Conta conta = new Conta();

private List<Conta> contas;

@Inject
private ContaDAO contaDAO;



public Conta getConta() {
	return this.conta;
}

public void grava() {
	if (conta.getId() == null) {
		contaDAO.adiciona(conta);
		limpaFormularioDoJSF();
	} else {
		contaDAO.altera(conta);
	}
	this.conta = new Conta();
	contas = contaDAO.lista();
	
}

@Transactional
public List<Conta> getContas() {
	if (contas == null) {
		System.out.println("Carregando contas");
		contas = contaDAO.lista();
	}
	return contas;
}

@Transactional
public void remove(Conta conta) {
	contaDAO.remove(conta);
	this.contas = contaDAO.lista();
	limpaFormularioDoJSF();
	
	}

public void setConta(Conta conta) {
	this.conta = conta;
}


private void limpaFormularioDoJSF() {
    this.conta = new Conta();
}	
}

Movimentacao.java

@Entity
@EntityListeners(MovimentacaoListener.class)
   public class Movimentacao implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

@Temporal(TemporalType.TIMESTAMP)
private Calendar data;

@ManyToOne
@JoinColumn(name="conta_pk")
private Conta conta;

private BigDecimal valor;


@Enumerated(EnumType.STRING)
private TipoMovimentacao tipoMovimentacao;



public Long getId() {
	return id;
}

public void setId(Long id) {
	this.id = id;
}


public TipoMovimentacao getTipoMovimentacao() {
	return tipoMovimentacao;
}

public void setTipoMovimentacao(TipoMovimentacao tipoMovimentacao) {
	this.tipoMovimentacao = tipoMovimentacao;
}


public Calendar getData() {
	return data;
}
public void setData(Calendar data) {
	this.data = data;
}

public Conta getConta() {
	return conta;
}

public void setConta(Conta conta) {
	this.conta = conta;
}

public BigDecimal getValor() {
	return valor;
}
public void setValor(BigDecimal valor) {
	this.valor = valor;
}


@PrePersist
@PreUpdate
public void preAltera() {
	System.out.println("Autalizando a data da movimentação");
	this.setData(Calendar.getInstance());
}

public boolean isValorNegativo() {
	// TODO Auto-generated method stub
	return false;
}



}

TipoMovimentacao.java

public enum TipoMovimentacao {
ENTRADA, SAIDA;

}

@Sergio_Guerjik

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.