Rollback ao persistir entidade com hibernate

3 respostas
jpajsfjavahibernate
P

Tenho uma entidade Produto:

@Entity
@Table(name = "produto")
public class Produto implements Serializable {

   private static final long serialVersionUID = 1L;
   private Long id;
   private Cliente cliente;
   private String nome;
   private BigDecimal valor;
       //getter e setter com anotacoes
}

e uma entidade Cliente:

@Entity
@Table(name = "cliente")
public class Cliente implements Serializable {

    private static final long serialVersionUID = -195972743343153998L;

    private Long id;

    private String nome;

    private String endereco;
    //getter e setter com anotacoes

}

e no bean faço:

@ManagedBean 
@ViewScoped
public class CadastroProdutosBean implements Serializable {

private static final long serialVersionUID = 1L;
private Produto produto = new Produto();
private Cliente cliente = new Cliente( );
private List<Cliente> clientes;
//metodo init

//nesse metodo recupero uma lista de cliente pra popular uma combo
public void prepararCadastro() {

	EntityManager manager = JpaUtil.getEntityManager();

	try {
		ClientesRepository clientesRepository = new ClientesRepository(manager);
		this.clientes = clientesRepository.listarTodos();

	} finally {
		manager.close();
	}
}

//aqui de fato faço a persistencia
public void salvar() {

	EntityManager manager = JpaUtil.getEntityManager();
	EntityTransaction transaction = manager.getTransaction();

	FacesContext context = FacesContext.getCurrentInstance();

	try {

		transaction.begin();

		CadastroProdutos cadastroProdutos = new CadastroProdutos(new ProdutosRepository(manager));
		cadastroProdutos.salvar(this.produto);

		CadastroClientes cadastroClientes = new CadastroClientes(new ClientesRepository(manager));
		//aqui cai na exception
		cadastroClientes.salvar(this.cliente);

		this.produto = new Produto();
		this.cliente = new Cliente();

		context.addMessage(null, new FacesMessage("Venda cadastrada com sucesso."));

		transaction.commit();

	} catch (Exception e) {

		transaction.rollback();

		FacesMessage mensagem = new FacesMessage(e.getMessage());
		mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);

		context.addMessage(null, mensagem);
	} finally {
		manager.close();
	}
}

entao no cadastroClientes.salvar da rollback na transação com o erro:

org.hibernate.PropertyValueException: not-null property references a null or transient value : com.br.modelos.Cliente.nome

Quando tento salvar somente o produto, salva normalmente os dados do produto inclusive o cliente_id, mas preciso salvar tambem os dados na tabela de cliente. Onde estou errando?

3 Respostas

campelo.m

Ola,

Voce tem que fazer o mapeamento do cliente na class de produto com onetoone, onetomany ou manytomany.

O cliente é setado dentro do produto, sendo assim nao tem necessidade de fazer dois salve em produto e cliente.

P

@campelo.m eu ja tenho esse mapeamento, apenas não coloquei no print:

@ManyToOne(optional = false)

@JoinColumn(name = cliente_id)

public Cliente getCliente() {

return cliente;

}

esta correto?

campelo.m

A questao entao é que:

Voce nao precisa de criar um Cliente.

O cliente ja esta no produto.

produto.setCliente(new Cliente());
produto.getCliente().setName("Cliente");

Fazendo assim quando voce der um save em produto ja salvaria o cliente, ou se salvar o cliente ja salvaria uma lista de produto(que é o mais correto).

Criado 23 de novembro de 2017
Ultima resposta 23 de nov. de 2017
Respostas 3
Participantes 2