Hibernate - Não insere, só atualiza

7 respostas
A

Galera,

estou parendendo e estou com problemas para identificar no Hibernate como inserir ou atualizar um objeto.
Quando eu tento inserir, ele atualiza o objeto no banco, nunca criando um novo. Alguém pode me dar uma luz?

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        Contato contato = new Contato();
        
        contato.setAge(21);
        contato.setNome("Mara");
   
        session.save(contato);
        session.flush();
       
        session.getTransaction().commit();        
  
        
        List<Contato> lista = listaContato();
        
       for( Contato c: lista){
    	   System.out.println(c.getNome());
    	   
       }
public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static {
        try {
	        System.out.println("Init");
            // Create the SessionFactory from hibernate.cfg.xml
            sessionFactory = new  Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

7 Respostas

Arcadex

Amigo, o segredo está na estrutura do seu HBM. mais precisamente em como vc declarou a chave primária da sua classe.

Posta aí o conteúdo do seu HBM.

Valeu.

A

Tirando a declaração de DTD

<hibernate-mapping> <class name="Contato"> <id name="id" column="id"> <generator class="native" /> </id> <property name="nome"/> <property name="age"/> </class> </hibernate-mapping>

Arcadex

Caro Andmart,

o motivo do seu problema está aqui:

<generator class=“native” />

Não sei qual banco vc está usando e nem como está a chave primária da sua tabela mas… de uma olhada aqui no manual.

http://www.hibernate.org/hib_docs/v3/reference/en/html/mapping.html
http://allapplabs.com/hibernate/hibernate_o_r_mapping_generator_element.htm
http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html#save(java.lang.Object)

A chave primária é fundamental para o hibernate identificar qdo vc está atualizando um objeto (já tem a chave) ou qdo é um novo registro (ele deve gerar uma primary key nova)

Vc está chamando o comando ‘save’ e vc está vendo na saída um ‘update’ ? Manda aí tb a saída do programa caso n consiga resolver o problema.

A

Desc no mysql:

+-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | nome | varchar(255) | YES | | NULL | | | age | int(11) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ 3 rows in set (0.31 sec)

Eu alterei o hbm para:

<id name="id" column="id" type="long">
		<generator class="native" />
	</id>

mas sem sucesso. Também alterei o tipo na classe Contato para long e nada. Ele atualiza, mas não insere.

O Hibernate cospe essas duas linhas.
Ao inserir:

Hibernate: insert into Contato (nome, age) values (?, ?)

E ao tentar listar:
Hibernate: select contato0_.id as id1_, contato0_.nome as nome1_, contato0_.age as age1_ from Contato contato0_

A

Desc no mysql:

+-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | nome | varchar(255) | YES | | NULL | | | age | int(11) | YES | | NULL | | +-------+--------------+------+-----+---------+----------------+ 3 rows in set (0.31 sec)

Eu alterei o hbm para:

<id name="id" column="id" type="long">
		<generator class="native" />
	</id>

mas sem sucesso. Também alterei o tipo na classe Contato para long e nada. Ele atualiza, mas não insere.

O Hibernate cospe essas duas linhas.
Ao inserir:

Hibernate: insert into Contato (nome, age) values (?, ?)

E ao tentar listar:
Hibernate: select contato0_.id as id1_, contato0_.nome as nome1_, contato0_.age as age1_ from Contato contato0_

Arcadex

andmart:

O Hibernate cospe essas duas linhas.
Ao inserir:

Hibernate: insert into Contato (nome, age) values (?, ?)

E ao tentar listar:
Hibernate: select contato0_.id as id1_, contato0_.nome as nome1_, contato0_.age as age1_ from Contato contato0_

Agora não entendi.
Ele está fazendo um INSERT.
Não tem nenhuma linha de erro.

A

matei a charada.

No hibernate.cfg.xml, a propriedade hbm2ddl.auto estava setada em create, ou seja, ele dropava as tabelas e levantava com o que ele tinha .

Criado 8 de março de 2007
Ultima resposta 8 de mar. de 2007
Respostas 7
Participantes 2