Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment annoter le champ d'auto-incrémentation MYSQL avec des annotations JPA

Pour utiliser un MySQL AUTO_INCREMENT colonne, vous êtes censé utiliser un IDENTITY stratégie :

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

Quel est ce que vous obtiendriez en utilisant AUTO avec MySQL :

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

Ce qui équivaut en fait à

@Id @GeneratedValue
private Long id;

En d'autres termes, votre mappage devrait fonctionner. Mais Hibernate devrait omettre le id colonne dans l'instruction d'insertion SQL, et ce n'est pas le cas. Il doit y avoir une sorte de décalage quelque part.

Avez-vous spécifié un dialecte MySQL dans votre configuration Hibernate (probablement MySQL5InnoDBDialect ou MySQL5Dialect selon le moteur que vous utilisez)?

Aussi, qui a créé la table? Pouvez-vous afficher le DDL correspondant ?

Suivi : Je n'arrive pas à reproduire votre problème. Utiliser le code de votre entité et votre DDL, Hibernate génère le SQL (attendu) suivant avec MySQL :

insert 
into
    Operator
    (active, password, username) 
values
    (?, ?, ?)

Notez que le id La colonne est absente de l'instruction ci-dessus, comme prévu.

Pour résumer, votre code, la définition de la table et le dialecte sont corrects et cohérents, cela devrait fonctionner. Si ce n'est pas le cas pour vous, peut-être que quelque chose n'est pas synchronisé (faites une construction propre, vérifiez le répertoire de construction, etc.) ou quelque chose d'autre ne va pas (vérifiez les journaux pour tout élément suspect).

Concernant le dialecte, le seul différence entre MySQL5Dialect ou MySQL5InnoDBDialect est que ce dernier ajoute ENGINE=InnoDB aux objets de table lors de la génération du DDL. L'utilisation de l'un ou l'autre ne modifie pas le SQL généré.