web-dev-qa-db-fra.com

ID d'incrémentation automatique Hibernate

J'ai une application j2ee utilisant hibernate avec annotation. Comment annoter le champ Id dans ma classe pojo pour le définir comme incrémentation automatique ou génération automatique. et en ajoutant le haricot, est-ce que je laisse ce champ dans mon haricot nul?

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

et vous en sortez null (0) en persistant. (null si vous utilisez les wrappers Integer/Long)

Dans certains cas, la stratégie AUTO est résolue en SEQUENCE plutôt qu'en IDENTITY ou TABLE, vous pouvez donc le définir manuellement sur IDENTITY ou TABLE (selon la base de données sous-jacente).

Il semble que SEQUENCE + en spécifiant le nom de la séquence a fonctionné pour vous.

146
Bozho

Faites-le comme suit: -

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

Vous pouvez utiliser n'importe quel nom arbitraire au lieu de kaugen. Cela a bien fonctionné, je pouvais voir ci-dessous des requêtes sur console

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)
31
Kaushik Lele

Hibernate définit cinq types de stratégies de génération d'identifiant:

[~ # ~] auto [~ # ~] - colonne d'identité, séquence ou tableau en fonction du DB sous-jacent

[~ # ~] table [~ # ~] - table contenant l'identifiant

[~ # ~] identité [~ # ~] - colonne d'identité

[~ # ~] séquence [~ # ~] - séquence

copie d'identité - l'identité est copiée à partir d'une autre entité

Exemple d'utilisation de table

@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;

pour plus de détails, consultez le lien .

7
user2530633

FYI

Utilisation de netbeans Les nouvelles classes d'entités de la base de données avec une colonne mysql * auto_increment * vous attribut avec les annotations suivantes:

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

Cela m'obtenait la même erreur en disant que la colonne ne devait pas être nulle, alors j'ai simplement supprimé l'annotation @NotNull en laissant l'attribut nul, et ça marche!

7
jmoreira

Si vous souhaitez incrémenter automatiquement une colonne numérique, vous pouvez éventuellement définir directement columnDefinition. Cela présente l'avantage que le schéma génère automatiquement la valeur même si elle est utilisée sans veille prolongée. Cela pourrait cependant rendre votre code spécifique à la base de données:

import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql
4
alfonx

Au cas où quelqu'un "heurterait" cette SO question dans la recherche de stratégies pour Informix table lorsque PK est le type Série.

J'ai trouvé que cela fonctionne ... à titre d'exemple.

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

Pour que cela fonctionne, assurez-vous quand vous faites session.SaveOrUpdate vous transmettez la valeur de la colonne special_serial_pk NULL .

Dans mon cas, je fais un HTML POST avec JSON comme si ...

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

Utilisation de netbeans New Entity Classes from Database avec une colonne mysql auto_increment, vous crée un attribut avec le code hibernate.hbm.xml suivant: id est auto increment

0
Ankur Patel