[RESOLVIDO] Error while commiting the transaction - AJUDA!

Boa tarde pessoal,

Estou tentando desenvolver uma aplicação JAVA com HIBERNATE + JPA.
Estou usando as seguintes entidades Pessoa, Endereço e Produto.
Pessoa tem relacionamento 1 - 1 com Endereço e 1 - N com Produto.
Produto tem relacionamento 1 - 1 com Endereço e N - 1 com Pessoa.
Ao executar a aplicação apresenta o seguinte erro: Error while commiting the transaction.

Minha Classe Pessoa:

@Entity
@Table(name = "pessoa")
@NamedQueries({@NamedQuery(name = "Pessoa.FindByCpfAndSenha", query = "SELECT p FROM Pessoa p WHERE p.cpf = :cpf AND p.senha = :senha"),
	@NamedQuery(name = "Pessoa.FindAll", query = "SELECT p FROM Pessoa p")})

public class Pessoa {

	@Id
	@Column(nullable = false)
	private String cpf;
	@Column(nullable = false)
	private String nome;
	@Column(nullable = false, name = "data_nascimento")
	@Temporal(TemporalType.DATE)
	private Date dataNascimento;
	@Column(nullable = false)
	private String senha;
	@OneToOne(cascade = CascadeType.ALL)
	private Endereco endereco;
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "pessoa")
	@JoinColumn(name = "nome")
	private List<Produto> produto;
	
	@Override
	public String toString() {
		return "CPF: " + getCpf() + "\nNome: " + getNome() + "\nData de Nascimento: " + getDataNascimento() + "\nSenha: " + getSenha()
		+ "\nEndereco de " + getNome() + "\nCep: " + endereco.getCep() + "\nRua: " + endereco.getRua() + "\n"
		+ "Bairro: " + endereco.getBairro() + "\nEstado: " + endereco.getEstado() + "\nComplemento: " + endereco.getComplemento() + "\n"
		+"Numero: " + endereco.getNumero();
	}

	public Pessoa() {
		super();
	}

	public Pessoa(String cpf, String nome, Date dataNascimento, String senha, Endereco endereco,
			List<Produto> produto) {
		super();
		this.cpf = cpf;
		this.nome = nome;
		this.dataNascimento = dataNascimento;
		this.senha = senha;
		this.endereco = endereco;
		this.produto = produto;
	}

Minha Classe Endereço:

@Entity
@Table(name = “endereco”)
public class Endereco {

@Id
@Column(nullable = false)
private int cep;
@Column(nullable = false)
private String rua;
@Column(nullable = false)
private String bairro;
@Column(nullable = false)
private String estado;
@Column(nullable = false)
private String complemento;
@Column(nullable = false)
private int numero;

public Endereco() {
	super();
}

public Endereco(int cep, String rua, String bairro, String estado, String complemento, int numero) {
	super();
	this.cep = cep;
	this.rua = rua;
	this.bairro = bairro;
	this.estado = estado;
	this.complemento = complemento;
	this.numero = numero;
}

Minha Classe Produto:

@Entity
@Table(name = “produto”)
@NamedQueries({@NamedQuery(name = “Produto.FindByNome”, query = “SELECT p FROM Produto p WHERE p.nome = :nome”),
@NamedQuery(name = “Produto.FindAll”, query = “SELECT p FROM Produto p”)})

public class Produto {

@Id
@Column(nullable = false)
private String nome;
@Column(name = "valor_bruto")
private double valorBruto;
@Column(nullable = false)
private double agencia;
@Column(nullable = false)
private double imposto;
@Column(nullable = false)
private double aluguel;
@Column(nullable = false)
private double energia;
@Column(name = "valor_liquido")
private double valorLiquido;
@Column(name = "inicio_contrato")
@Temporal(TemporalType.DATE)
private Date inicioContrato;
@Column(name = "termino_contrato")
@Temporal(TemporalType.DATE)
private Date terminoContrato;
@OneToOne(cascade = CascadeType.ALL)
private Endereco endereco;
@ManyToOne
private Pessoa pessoa;

@Override
public String toString() {
	return "Produto [nome=" + nome + ", valorBruto=" + valorBruto + ", agencia=" + agencia + ", imposto=" + imposto
			+ ", aluguel=" + aluguel + ", energia=" + energia + ", valorLiquido=" + valorLiquido
			+ ", inicioContrato=" + inicioContrato + ", terminoContrato=" + terminoContrato + ", endereco="
			+ endereco + ", pessoa=" + pessoa + "]";
}

public Produto() {
	super();
}

public Produto(String nome, double valorBruto, double agencia, double imposto, double aluguel, double energia,
		double valorLiquido, Date inicioContrato, Date terminoContrato, Endereco endereco, Pessoa pessoa) {
	super();
	this.nome = nome;
	this.valorBruto = valorBruto;
	this.agencia = agencia;
	this.imposto = imposto;
	this.aluguel = aluguel;
	this.energia = energia;
	this.valorLiquido = valorLiquido;
	this.inicioContrato = inicioContrato;
	this.terminoContrato = terminoContrato;
	this.endereco = endereco;
	this.pessoa = pessoa;
}

Minha Classe Repositório:

public class RepositorioPessoa {

EntityManagerFactory emf;
EntityManager em;

public RepositorioPessoa(){
	emf = Persistence.createEntityManagerFactory("sistema");
	em = emf.createEntityManager();
}

public void cadastro(Pessoa pessoa) throws Excecao{
	try {
		em.getTransaction().begin();
		em.merge(pessoa);
		em.getTransaction().commit();
	} catch(Exception e){
		System.out.println("ERRO AO GRAVAR: " + e.getMessage());
		if (!em.getTransaction().isActive()) {
			em.getTransaction().begin();
		}
		em.getTransaction().rollback();
	}finally {
		emf.close();
	}
}

Minha Classe Principal:

public class Main {

public static void main(String[] args) throws Excecao, ParseException{

    RepositorioPessoa rPessoa = new RepositorioPessoa();
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

    Endereco e = new Endereco();

    e.setCep(53190000);
    e.setRua("Rua Jose Melo");
    e.setBairro("Aguas Santas");
    e.setComplemento("Casa1");
    e.setNumero(405);
    e.setEstado("Pernambuco");

    Produto produto = new Produto();

    produto.setNome("NoteBook");
    produto.setValorBruto(1000.00);
    produto.setAgencia(200.00);
    produto.setImposto(400.00);
    produto.setAluguel(500.00);
    produto.setEnergia(100.00);        
    produto.setValorLiquido();
    produto.setInicioContrato(df.parse("10/01/2016"));
    produto.setTerminoContrato(df.parse("15/01/2016"));
    produto.setEndereco(e);
    
    List<Produto> produtos = new ArrayList<>();
    produtos.add(produto);

    Pessoa pessoa = new Pessoa();

    pessoa.setCpf("12345678910");
    pessoa.setNome("12345678901");
    pessoa.setDataNascimento(df.parse("01/01/1999"));
    pessoa.setSenha("12345");
    pessoa.setEndereco(e);
    pessoa.setProduto(produtos);

    produto.setPessoa(pessoa);
    
    rPessoa.cadastro(pessoa);

Erro que Apresenta:

Hibernate:
insert
into
produto
(agencia, aluguel, endereco_cep, energia, imposto, inicio_contrato, pessoa_cpf, termino_contrato, valor_bruto, valor_liquido, nome)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ERRO AO GRAVAR: Error while commiting the transaction

Erro sem o tratamento do Try:

Hibernate:
insert
into
produto
(agencia, aluguel, endereco_cep, energia, imposto, inicio_contrato, pessoa_cpf, termino_contrato, valor_bruto, valor_liquido, nome)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Exception in thread “main” javax.persistence.RollbackException: Error while commiting the transaction
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71)
at br.com.sistema.repositorio.RepositorioPessoa.cadastro(RepositorioPessoa.java:27)
at br.com.sistema.apresentacao.Main.main(Main.java:61)
Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
… 2 more
Caused by: java.sql.BatchUpdateException: Cannot add or update a child row: a foreign key constraint fails (sistema.produto, CONSTRAINT FKED8DCEF9EF6FCB9B FOREIGN KEY (nome) REFERENCES pessoa (cpf))
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1669)
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1085)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
… 10 more

Deu falha nas FKs ai… da uma olhada

1 curtida

Obrigado Igor,

Problema Resolvido!

A bronca era no @JoinColumn(name = “nome”), removi essa linha e agora está gravando no banco.