Hibernate - Não insere, só atualiza

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?

[code]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());
	   
   }[/code]

[code]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;
}

}[/code]

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.

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>

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.

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_

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_

[quote=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_[/quote]

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

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 .