ID d'incrémentation automatique Hibernate

86

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éré automatiquement. et en ajoutant le bean, est-ce que je laisse ce champ dans mon bean nul?

cédric
la source

Réponses:

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

et vous le laissez null( 0) lorsque vous persistez. ( nullsi vous utilisez les Integer/ Longwrappers)

Dans certains cas, la AUTOstratégie est résolue à SEQUENCErathen plutôt qu'à IDENTITYou TABLE, vous pouvez donc la définir manuellement sur IDENTITYou TABLE(selon la base de données sous-jacente).

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

Bozho
la source
mon identifiant est de type string. que vais-je y mettre. Parce que j'ai cette erreur. Causé par: javax.el.ELException: org.hibernate.exception.SQLGrammarException: impossible d'obtenir la valeur de séquence suivante
cedric
4
auto-incrémentation signifie que c'est un nombre qui est incrémenté. Une chaîne ne peut pas être incrémentée. Rendre la colonne int
Bozho
La colonne myid de la base de données est de type number. Et j'ai déjà changé mon identifiant dans mon pojo en int. je reçois la séquence d'erreur n'existe pas
cedric
2
Pour Oracle, SEQUENCE est la chose la plus proche de l'auto-incrémentation. Vous devez créer la séquence à l'avance, sauf si vous laissez Hibernate générer votre schéma. Si vous pensez pouvoir prendre en charge plusieurs bases de données à un moment donné, utilisez TABLE.
Brian Deterling
2
N'utilisez pas d'identité, Oracle ne prend pas en charge l'identité, il prend en charge la séquence.
JuanZe
33

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 les requêtes sur la console

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)
Kaushik Lele
la source
Celui-ci fonctionne pour moi. Mais cela ne me laisse pas définir la valeur d'identification. J'ai essayé de setID avec des entiers ou des int, mais il utilise max à tout moment. Que devrais-je faire?
desudesudesu
utilisez @GenericGenerator (name = "incrementId", strategy = "assigned") @GeneratedValue (generator = "incrementId"). Cela vous permettra de définir l'id par vous-même, mais si vous ne passez pas l'id, il sera 0.
Ravi Kant
@Kaushik Lele Est-ce que la stratégie = "incrémentation" met en veille prolongée une stratégie d'incrémentation intégrée? Est-ce sous lequel de ces SÉQUENCE, IDENTITÉ, AUTO, TABLE?
feel good et programmation
Que diriez-vous de 700 millions d'enregistrements dans la table? Cela pourrait être le problème sans index, je pense
user2171669
10

FYI

En utilisant NetBeans nouvelles classes d' entité de base de données avec MySQL * colonne auto_increment *, vous crée un 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 disant que la colonne ne devait pas être nulle, alors j'ai simplement supprimé l'anotation @NotNull en laissant l'attribut nul, et cela fonctionne!

Jmoreira
la source
7

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

AUTO - soit colonne d'identité, séquence ou table selon le DB sous-jacent

TABLE - table contenant l'identifiant

IDENTITY - colonne d'identité

SEQUENCE - séquence

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

Exemple utilisant 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 .

user2530633
la source
4

Si vous avez une colonne numérique que vous souhaitez incrémenter automatiquement, cela peut être une option à définir columnDefinitiondirectement. Cela présente l'avantage que le schéma génère automatiquement la valeur même s'il est utilisé sans mise en veille prolongée. Cela peut rendre votre code spécifique à la base de données:

import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql
Alfonx
la source
MySQL est @Column (columnDefinition = "integer auto_increment")
yeralin
1

Au cas où quelqu'un «cogne» dans cette question SO à la recherche de stratégies pour la table Informix lorsque PK est de type Serial .

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 que lorsque 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 ça ...

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

L'utilisation de nouvelles classes d'entités netbeans à partir de la base de données avec une colonne mysql auto_increment vous crée un attribut avec le hibernate.hbm.xml suivant: id est l'incrément automatique

Ankur Patel
la source