Hibernate 4 X MySQL auto_increment

15 respostas
drsmachado

Olá camaradas,

Estava eu bem tranquilo, fazendo uns exemplos com o Hibernate 4 e MySQL, quando, de repente, ao tentar executar o projeto e criar as tabelas, vejo que o script de criação do Hibernate estava, no mínimo, estranho.

A DDL gerada era, mais ou menos, assim:

E a minha entity está assim

@Entity
@Table(name="pessoas")
public class Pessoa implemens Serializable{
   @Transient
   private Long defaultSerialVerionID = 1L;
  
   @Id
   @GeneratedValue
   private Integer id;
   @Column(nullable=false, length=200)
   private String nome;
   //getters e setters
}

Pois bem, pergunto: Por que raios o hibernate ignorou o GeneratedValue?
Ah, também tentei com o dialect como MySQLInnoDBDialect, com a strategy=AUTO e até com columnDefinition, mas nada mudou a saída do hibernate.

Alguém sabe?

Ah, sim, estou usando o Hibernate 4.1.2-Final

15 Respostas

Hebert_Coelho

Pq vc fala q ele ignorou?
PK do mysql não é auto-incremento?
Você testou e deu erro?

drsmachado

jakefrog:
Pq vc fala q ele ignorou?
PK do mysql não é auto-incremento?
Você testou e deu erro?

Ignorar = não colocar na DDL.

Como descrito no tópico, a DDL gerada foi

CREATE TABLE PESSOAS(id Integer not null unique, nome varchar(200) not null, primary key(id))

Enquanto que, até a versão 3.6.9Final, quando as mesmas anotações eram colocadas, a DDL gerada era

@Entity  
    @Table(name="pessoas")  
    public class Pessoa implemens Serializable{  
       @Transient  
       private Long defaultSerialVerionID = 1L;  
        
       @Id  
       @GeneratedValue  
       private Integer id;  
       @Column(nullable=false, length=200)  
       private String nome;  
       //getters e setters  
    }
CREATE TABLE PESSOAS(id Integer not null auto_increment, nome varchar(200) not null, primary key(id))

Percebe a diferença?

Hebert_Coelho

Pois é, eu li aqui na spec e fala que o valor default é utilizar o incremento que o DB tem como padrão.

Será que agora o mysql já não incrementa as pks sem precisar marcar como autoincremento?

Faz um outro teste: @GeneratedValue(strategy=GenerationType.AUTO) ou @GeneratedValue(strategy=GenerationType.IDENTITY)

drsmachado

jakefrog:
Pois é, eu li aqui na spec e fala que o valor default é utilizar o incremento que o DB tem como padrão.

Será que agora o mysql já não incrementa as pks sem precisar marcar como autoincremento?

Faz um outro teste: @GeneratedValue(strategy=GenerationType.AUTO)


Exatamente igual;


@GeneratedValue(strategy=GenerationType.IDENTITY)

Igual.
Com strategy = SEQUENCE, gera erro, pois não há suporte.

Sem contar que o sujeito sequer consegue criar a tabela com a propriedade

hibernate.hbm2ddl.auto = update

só como create

drsmachado

Ah, e a documentação está furada, perceba que ele ainda cria as sessions baseado em Configuration, que, está deprecated.
O padrão agora é ServiceRegistry…

Hebert_Coelho

Será que não é o driver?

Pq tá bizarro isso… O update deveria criar tudo numa boa. O.o

Se você dropar tudo e criar apenas o database com o “update” ele não cria?

O usuário da sua aplicação tem permissão?

drsmachado

jakefrog:
Será que não é o driver?

Pq tá bizarro isso… O update deveria criar tudo numa boa. O.o

Se você dropar tudo e criar apenas o database com o “update” ele não cria?

O usuário da sua aplicação tem permissão?


Uso o mesmo driver desde novembro do ano passado.
Uso a mesma máquina, SO, banco de dados, usuário, IDE…
Só a versão do Hibernate é diferente.
Antes era a 3.6.9-Final, depois passei para a 4.1.1-Final e agora essa bomba do 4.1.2-Final.
Sinceramente, tá uma droga.

Bizarro era quando funcionava, agora tá uma desgraça total.
Deve ser sinal do 2012.

Hebert_Coelho

drsmachado:
jakefrog:
Será que não é o driver?

Pq tá bizarro isso… O update deveria criar tudo numa boa. O.o

Se você dropar tudo e criar apenas o database com o “update” ele não cria?

O usuário da sua aplicação tem permissão?


Uso o mesmo driver desde novembro do ano passado.
Uso a mesma máquina, SO, banco de dados, usuário, IDE…
Só a versão do Hibernate é diferente.
Antes era a 3.6.9-Final, depois passei para a 4.1.1-Final e agora essa bomba do 4.1.2-Final.
Sinceramente, tá uma droga.

Bizarro era quando funcionava, agora tá uma desgraça total.
Deve ser sinal do 2012.

Eita ferro, então deve ser bug mesmo.

Sorry! =/ Final 2012 realmente tá chegando! >_<’’

Rodrigo_Sasaki

Fujam do Hibernate 4 por enquanto…

No projeto aqui nós mudamos do Glassfish 3.1 para o JBoss 7.1 (a versão do Hibernate que vem por padrão no JBoss 7.1 é a 4)

e com isso alguns selects mais complexos deixaram de funcionar, e a exceção dizia que “poderia ser um erro do hibernate”, não lembro especificamente o erro, mas tive que mudar a versão do Hibernate no JBoss de volta para a 3.

Pesquisando o erro eu achei um site que dizia que só seria corrigido no lançamento do Hibernate 5…

muita bagunça

drsmachado

Sei lá, mas é extremamente irritante isso.
Fora que na pasta required, dentro de lib, não estão vindo todos os jars requeridos. O jandex, por exemplo, não vem e se você não coloca, dá erro. Nem deixa compilar.

Por isso vejo o crescimento do EclipseLink como inevitável.

drsmachado

digaoneves:
Fujam do Hibernate 4 por enquanto…

No projeto aqui nós mudamos do Glassfish 3.1 para o JBoss 7.1 (a versão do Hibernate que vem por padrão no JBoss 7.1 é a 4)

e com isso alguns selects mais complexos deixaram de funcionar, e a exceção dizia que “poderia ser um erro do hibernate”, não lembro especificamente o erro, mas tive que mudar a versão do Hibernate no JBoss de volta para a 3.

Pesquisando o erro eu achei um site que dizia que só seria corrigido no lançamento do Hibernate 5…

muita bagunça


Pelo jeito os caras estão loucos mesmo.
Enfim, o jeito será voltar atrás e usar o 3.6.9-Final, estável e simples de se usar.
Uma pena.

Rodrigo_Sasaki

drsmachado:


Pelo jeito os caras estão loucos mesmo.
Enfim, o jeito será voltar atrás e usar o 3.6.9-Final, estável e simples de se usar.
Uma pena.

Eu também achei uma pena, estava animado pra ver as mudanças no Hibernate e acontece uma dessa…
não sei se eles estão tão focados em lançar versões novas que nem se preocupam em manter as que já estão lá…

Eu recomendo voltar a versão mesmo, foi o que fiz.

drsmachado

O pior foi ter confiado e ter tido essa desagradavél surpresa na frente de 10 alunos.
Enfim, a vida segue, às vezes precisamos dar rollback…

MiguelCP

Já resolveu isso cara, pode ser que seja isso:

CREATE TABLE PESSOAS(id Integer not null unique AUTO_INCREMENT, nome varchar(200) not null, primary key(id))

Como está no site do mysql:
http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

ken420

É so da uma olhadinha no Google que vc sana seu problema,

Impressionante como as pessoas criam topicos sem antes ao menos pesquisar no google antes.

PALHACADA

Criado 10 de abril de 2012
Ultima resposta 10 de ago. de 2012
Respostas 15
Participantes 5