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?
Respostas:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
e você deixa null
( 0
) ao persistir. ( null
se você usar Integer
/ Long
wrappers)
Em alguns casos, a AUTO
estratégia é resolvida para SEQUENCE
rathen do que para IDENTITY
ou TABLE
, portanto, você pode querer defini-la manualmente para IDENTITY
ou TABLE
(dependendo do banco de dados subjacente).
Parece que SEQUENCE
+ especificar o nome da sequência funcionou para você.
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 (?, ?, ?, ?, ?)
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!
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 .
Se você tiver uma coluna numérica que deseja incrementar automaticamente, pode ser uma opção para definir columnDefinition
diretamente. 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
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
}
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