Sou iniciante, tentando aprender via tutoriais etc …
Fiz um teste muito simples de insert que está dando erro.
Alguém pode me ajudar e explicar onde esta o meu erro ?
Foi informado:
Primeiro Registro:
Nome=Primeiro
Idade=1
Segundo Registro:
Nome=Segundo
Idade=2
segue os fontes:
ProjetoGrud\src\META-INF\persistence.xml
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="projetogrud" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/projetogrud" />
<property name="javax.persistence.jdbc.user" value="usuario" />
<property name="javax.persistence.jdbc.password" value="senha" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.use_sql_comments" value="false" />
<property name="hibernate.jdbc.wrap_result_sets" value="false" />
<property name="hibernate.hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
ProjetoGrud\src\com\entities\Pesooa.java:
package com.entities;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="pessoas")
public class Pessoa {
private Long id;
private String nome;
private Integer idade;
@Id
@GeneratedValue
public Long getId() {
return id;
}
Gets e Sets ...
}
ProjetoGrud\src\com\dao\PessoaDAO:
package com.dao;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.entities.Pessoa;
public class PessoaDAO {
protected EntityManager entityManager;
public PessoaDAO() {
entityManager = getEntityManager();
}
private EntityManager getEntityManager() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("projetogrud");
if (entityManager == null) {
entityManager = factory.createEntityManager();
}
return entityManager;
}
public void persist(Pessoa pessoa) {
System.out.println("Antes de persistir: <Id: " + pessoa.getId() + " Nome: " + pessoa.getNome() + " Idade: " + pessoa.getIdade() + ">");
try {
entityManager.getTransaction().begin();
entityManager.persist(pessoa);
entityManager.getTransaction().commit();
} catch (Exception ex) {
ex.printStackTrace();
entityManager.getTransaction().rollback();
}
System.out.println("Apos persistir: <Id: " + pessoa.getId() + " Nome: " + pessoa.getNome() + " Idade: " + pessoa.getIdade() + ">");
System.out.println("----------------------------------------");
System.out.println("");
}
}
ProjetoGrud\src\com\main\TestePersiste.java
ackage com.main;
import javax.swing.JOptionPane;
import com.dao.PessoaDAO;
import com.entities.Pessoa;
public class TestePersiste {
public static void main(String[] args) {
Pessoa sql = new Pessoa();
PessoaDAO dao = new PessoaDAO();
do {
//sql.setId(null); //<<--------
sql.setNome(JOptionPane.showInputDialog("Informe nome: "));
sql.setIdade(Integer.parseInt(JOptionPane.showInputDialog("Informe idade: ")));
dao.persist(sql);
Integer resposta = JOptionPane.showConfirmDialog(null, "Continuar?");
if (resposta == JOptionPane.NO_OPTION) break;
} while (true);
}
}
1. Erro
//sql.setId(null); //<<-------- Linha comentada
O primeiro registro é inserido normalmente
O segundo registro é considerado Update, e dá pau.
Antes de persistir: <Id: null Nome: Primeiro Idade: 1>
Hibernate: insert into pessoas (pessoas_idade, pessoas_nome) values (?, ?)
Apos persistir: <Id: 41 Nome: Primeiro Idade: 1>
----------------------------------------
Antes de persistir: <Id: 41 Nome: Segundo Idade: 2>
Hibernate: update pessoas set pessoas_idade=?, pessoas_nome=? where pessoas_id=?
javax.persistence.RollbackException: Error while committing the transaction
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:92)
at com.dao.PessoaDAO.persist(PessoaDAO.java:30)
at com.main.TestePersiste.main(TestePersiste.java:17)
Caused by: java.lang.NullPointerException
at org.hibernate.ejb.event.EJB3PostUpdateEventListener.handlePostUpdate(EJB3PostUpdateEventListener.java:71)
at org.hibernate.ejb.event.EJB3PostUpdateEventListener.onPostUpdate(EJB3PostUpdateEventListener.java:67)
at org.hibernate.action.internal.EntityUpdateAction.postUpdate(EntityUpdateAction.java:248)
at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:205)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:364)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:356)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:278)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:328)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75)
... 2 more
Exception in thread "main" java.lang.IllegalStateException: Transaction not active
at org.hibernate.ejb.TransactionImpl.rollback(TransactionImpl.java:103)
at com.dao.PessoaDAO.persist(PessoaDAO.java:33)
at com.main.TestePersiste.main(TestePersiste.java:17)
2. Erro
sql.setId(null); //<<-------- Linha descomentada
O primeiro registro é inserido normalmente
O segundo dá pau.
Antes de persistir: <Id: null Nome: Primeiro Idade: 1>
Hibernate: insert into pessoas (pessoas_idade, pessoas_nome) values (?, ?)
Apos persistir: <Id: 42 Nome: Primeiro Idade: 1>
----------------------------------------
Antes de persistir: <Id: null Nome: Segundo Idade: 2>
javax.persistence.RollbackException: Error while committing the transaction
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:92)
at com.dao.PessoaDAO.persist(PessoaDAO.java:30)
at com.main.TestePersiste.main(TestePersiste.java:17)
Caused by: javax.persistence.PersistenceException: org.hibernate.HibernateException: identifier of an instance of com.entities.Pessoa was altered from 42 to null
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1365)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1293)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:80)
... 2 more
Caused by: org.hibernate.HibernateException: identifier of an instance of com.entities.Pessoa was altered from 42 to null
at org.hibernate.event.internal.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:82)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:194)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:156)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:227)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75)
... 2 more
Exception in thread "main" java.lang.IllegalStateException: Transaction not active
at org.hibernate.ejb.TransactionImpl.rollback(TransactionImpl.java:103)
at com.dao.PessoaDAO.persist(PessoaDAO.java:33)
at com.main.TestePersiste.main(TestePersiste.java:17)