Hibernate Auto Increment ID

86

Eu tenho um aplicativo j2ee usando hibernação com anotação. Como faço para anotar o campo Id em minha classe pojo para defini-lo como incremento automático ou gerado automaticamente. e, ao adicionar o bean, deixo esse campo em meu bean nulo?

cedric
fonte

Respostas:

161
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

e você deixa null( 0) ao persistir. ( nullse você usar Integer/ Longwrappers)

Em alguns casos, a AUTOestratégia é resolvida para SEQUENCErathen do que para IDENTITYou TABLE, portanto, você pode querer defini-la manualmente para IDENTITYou TABLE(dependendo do banco de dados subjacente).

Parece que SEQUENCE+ especificar o nome da sequência funcionou para você.

Bozho
fonte
meu id é do tipo string. o que vou definir para isso. Porque recebo este erro. Causado por: javax.el.ELException: org.hibernate.exception.SQLGrammarException: não foi possível obter o próximo valor de sequência
cedric
4
autoincremento significa que é um número que é incrementado. Uma String não pode ser incrementada. Faça a coluna int
Bozho
A coluna myid no banco de dados é do tipo number. E eu já mudei minha id no meu pojo para int. entendi que a sequência de erro não existe
cedric
2
Para Oracle, SEQUENCE é a coisa mais próxima do incremento automático. Você tem que criar a sequência com antecedência, a menos que esteja permitindo que o Hibernate gere seu esquema. Se você acha que pode oferecer suporte a vários bancos de dados em algum momento, use TABLE.
Brian Deterling
2
Não use identidade, o Oracle não suporta identidade, ele suporta sequência.
JuanZe
33

Faça o seguinte: -

@Id
@GenericGenerator(name="kaugen" , strategy="increment")
@GeneratedValue(generator="kaugen")
@Column(name="proj_id")
  public Integer getId() {
    return id;
 }

Você pode usar qualquer nome arbitrário em vez de kaugen. Funcionou bem, pude ver as consultas abaixo no console

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)
Kaushik Lele
fonte
Este funciona para mim. Mas não me deixa definir o valor do ID. Tentei setID com inteiros ou int, mas ele usa max a qualquer hora. O que devo fazer?
desudesudesu
use @GenericGenerator (name = "incrementId", estratégia = "atribuído") @GeneratedValue (generator = "incrementId"). Isso permitirá que você defina o id por conta própria. Mas se você não passar o id, ele será 0.
Ravi Kant
@Kaushik Lele A estratégia = "incremento" hibernar estratégia de incremento embutida? Está sob qual destes SEQUÊNCIA, IDENTIDADE, AUTO, TABELA?
sinta
Que tal 700 milhões de registros na tabela? Este pode ser o problema sem índice, eu acho
user2171669
10

Para sua informação

Usando netbeans novas classes de entidade do banco de dados com uma coluna mysql * auto_increment *, cria um atributo com as seguintes anotações:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@NotNull
private Integer id;

Isso estava me dando o mesmo erro dizendo que a coluna não deve ser nula, então eu simplesmente removi a anotação @NotNull deixando o atributo nulo, e funcionou!

Jmoreira
fonte
7

O Hibernate define cinco tipos de estratégias de geração de identificadores:

AUTO - coluna de identidade, sequência ou tabela, dependendo do banco de dados subjacente

TABELA - tabela que contém o id

IDENTIDADE - coluna de identidade

SEQUENCE - sequência

cópia da identidade - a identidade é copiada de outra entidade

Exemplo usando tabela

@Id
@GeneratedValue(strategy=GenerationType.TABLE , generator="employee_generator")
@TableGenerator(name="employee_generator", 
                table="pk_table", 
                pkColumnName="name", 
                valueColumnName="value",                            
                allocationSize=100) 
@Column(name="employee_id")
private Long employeeId;

para mais detalhes, verifique o link .

user2530633
fonte
4

Se você tiver uma coluna numérica que deseja incrementar automaticamente, pode ser uma opção para definir columnDefinitiondiretamente. Isso tem a vantagem de que o esquema gera automaticamente o valor, mesmo se for usado sem hibernar. Isso pode tornar seu código específico do banco de dados:

import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql
alfonx
fonte
MySQL é @Column (columnDefinition = "integer auto_increment")
yeralin
1

No caso de alguém "esbarrar" nesta questão do SO em busca de estratégias para a tabela Informix, quando PK for do tipo Serial .

Eu descobri que isso funciona ... como um exemplo.

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "special_serial_pk")
private Integer special_serial_pk;

Para que isso funcione certifique-se de que ao fazer session.SaveOrUpdate você passa o valor para a coluna special_serial_pk NULL .

No meu caso eu faço um HTML POST com JSON assim ...

{
"special_serial_pk": null, //<-- Field to be incremented
"specialcolumn1": 1,
"specialcolumn2": "I love to code",
"specialcolumn3": true
}
Henrique C.
fonte
0

Usando netbeans novas classes de entidade de banco de dados com um mysql coluna auto_increment , cria um atributo com o seguinte hibernate.hbm.xml: id is auto increment

Ankur Patel
fonte