Duvida gravar registro no Hibernate

0 respostas
hlghelcio

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)
Criado 2 de junho de 2013
Respostas 0
Participantes 1