Comment Annoter le champ MYSQL autoincrement avec les annotations JPA

directement au point, le problème est de sauver L'opérateur Objet dans MySQL DB. Avant de sauvegarder, j'essaie de sélectionner à partir de cette table et cela fonctionne, ainsi que la connexion à la base de données.

Voici mon objet opérateur:

@Entity
public class Operator{

   @Id
   @GeneratedValue
   private Long id;

   private String username;

   private String password;


   private Integer active;

   //Getters and setters...
}

pour enregistrer j'utilise la méthode JPA EntityManager ’s persist .

voici quelques logs:

Hibernate: insert into Operator (active, password, username, id) values (?, ?, ?, ?)
com.mysql.jdbc.JDBC4PreparedStatement@15724a0: insert into Operator (active,password, username, id) values (0, 'pass', 'user', ** NOT SPECIFIED **)

de la façon dont je le vois, le problème est la configuration avec auto increment mais je ne peux pas comprendre où.

essayé quelques trucs que j'ai vu ici: Hibernate ne respectant pas MySQL auto_ increment primary key field mais rien de tout cela n'a fonctionné

si d'autres fichiers de configuration sont nécessaires, je les fournirai.

DDL:

CREATE TABLE `operator` ( 
`id` INT(10) NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(40) NOT NULL,
`last_name` VARCHAR(40) NOT NULL,
`username` VARCHAR(50) NOT NULL,
`password` VARCHAR(50) NOT NULL,
`active` INT(1) NOT NULL,
PRIMARY KEY (`id`)
)
84
demandé sur Community 2010-11-05 02:51:10

6 réponses

pour utiliser une colonne MySQL AUTO_INCREMENT , vous êtes censé utiliser une stratégie IDENTITY :

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

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

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

qui est en fait équivalent à

@Id @GeneratedValue
private Long id;

En d'autres termes, votre cartographie devrait fonctionner. Mais Hibernate devrait omettre la colonne id dans la déclaration SQL insert, et il n'est pas. Il doit y avoir une sorte de décalage quelque part.

avez-vous spécifié un dialecte MySQL dans votre configuration D'hibernation (probablement MySQL5InnoDBDialect ou MySQL5Dialect selon le moteur que vous utilisez)?

qui a créé la table? Pouvez-vous montrer la DDL correspondante?

suivi: Je ne peux pas reproduire votre problème. En utilisant le code de votre entité et votre DDL, Hibernate génère le SQL suivant (attendu) avec MySQL:

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

notez que la colonne id est absente de l'énoncé ci-dessus, comme prévu.

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

en ce qui concerne le dialecte, le seulement différence entre MySQL5Dialect ou MySQL5InnoDBDialect est que le plus récent ajoute ENGINE=InnoDB aux objets de table lors de la génération de la DDL. Utiliser l'un ou l'autre ne change pas le SQL généré.

118
répondu Pascal Thivent 2010-11-06 21:12:54

en utilisant MySQL, seule cette approche fonctionnait pour moi:

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

les deux autres approches énoncées par Pascal dans sa réponse ne fonctionnaient pas pour moi.

26
répondu Jelle 2016-04-14 04:17:55

pour toute personne lisant ceci qui utilise EclipseLink pour JPA 2.0, voici les deux annotations que j'ai dû utiliser pour obtenir JPA pour persister les données, où " MySequenceGenerator "est quel que soit le nom que vous voulez donner au générateur," myschema "est le nom du schéma dans votre base de données qui contient l'objet sequence, et" mysequence " est le nom de l'objet sequence dans la base de données.

@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="MySequenceGenerator")
@SequenceGenerator(allocationSize=1, schema="myschema",  name="MySequenceGenerator", sequenceName = "mysequence")

pour ceux qui utilisent EclipseLink( et éventuellement d'autres fournisseurs JPA), il est Il est essentiel que vous définissiez l'attribut allocationSize pour qu'il corresponde à la valeur incrémentielle définie pour votre séquence dans la base de données. Si vous ne le faites pas, vous obtiendrez un échec générique de persistance, et gaspiller beaucoup de temps à essayer de le retrouver, comme je l'ai fait. Voici la page de référence qui m'a aidé à surmonter ce défi:

http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey#Using_Sequence_Objects

Aussi, pour donner le contexte, voici ce que nous utilisons:

Java 7 Glassfish 3.1 PostgreSQL 9.1 PrimeFaces 3.2 / JSF 2.1

aussi, par paresse, j'ai construit ceci dans Netbeans avec les assistants pour générer des Entities à partir de DB, des contrôleurs à partir D'Entities, et JSF à partir D'Entities, et les assistants (évidemment) ne savent pas comment traiter avec les colonnes d'ID basées sur la séquence, donc vous devrez ajouter manuellement ces annotations.

11
répondu Max Awesome 2012-05-03 21:39:32

s'il vous plaît assurez-vous que id datatype est Long au lieu de chaîne, si cela sera string alors @GeneratedValue annotation ne fonctionnera pas et le production sql pour

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

create table VMS_AUDIT_RECORDS (id **varchar(255)** not null auto_increment primary key (id))

qui doit être

create table VMS_AUDIT_RECORDS (id **bigint** not null auto_increment primary key (id))
3
répondu ABHAY JOHRI 2017-11-15 09:55:42

j'ai tout essayé, mais j'ai quand même été incapable de le faire, j'utilise mysql, jpa avec hibernation, j'ai résolu mon problème en assignant une valeur de id 0 dans le constructeur Voici mon code d'identification de déclaration

@Id
@Column(name="id",updatable=false,nullable=false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
0
répondu M. Waseem Ullah Khan 2018-03-17 16:55:16

pouvez-vous vérifier si vous vous êtes connecté à la bonne base de données. comme j'ai été confronté au même problème, mais finalement j'ai trouvé que je me suis connecté à une base de données différente.

identité prend en charge les colonnes d'identité dans DB2, MySQL, MS SQL Server, Sybase et HypersonicSQL. L'identificateur retourné est de type long, short ou int.

Plus D'Informations: http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/mapping.html#mapping-declaration-id

0
répondu Mohan Reddy 2018-09-12 11:57:35