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 .