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