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?
@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.
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 (?, ?, ?, ?, ?)
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 .
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!
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
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
}
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