137 votes

Comment annoter un champ MYSQL autoincrement avec des annotations JPA ?

Pour aller droit au but, le problème est de sauvegarder l'objet Operator dans la base de données MySQL. Avant de sauvegarder, j'essaie de sélectionner à partir de cette table et cela fonctionne, de même 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 économiser, j'utilise JPA EntityManager 's persist méthode.

Voici un extrait du journal :

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 mon point de vue, le problème se situe au niveau de la configuration et de l'incrémentation automatique, mais je n'arrive pas à savoir où.

J'ai essayé quelques astuces que j'ai vues ici : Hibernate ne respecte pas le champ clé primaire auto_incrémenté de MySQL 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`)
)

6voto

Adel Points 100

Si vous utilisez MariaDB, cela fonctionnera

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
private Long id;

Pour en savoir plus, vous pouvez consulter https://thorben-janssen.com/hibernate-tips-use-auto-incremented-column-primary-key/

1voto

J'ai tout essayé, mais je n'y suis pas parvenu, j'utilise mysql, jpa avec hibernate, j'ai résolu mon problème en assignant la valeur 0 dans le constructeur. Voici mon code de déclaration de l'id

@Id
@Column(name="id",updatable=false,nullable=false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

1voto

Anjali Pavithra Points 72

Comme vous avez défini l'id dans le type int lors de la création de la base de données, vous devez utiliser le même type de données dans la classe de modèle. Et comme vous avez défini l'incrémentation automatique de l'identifiant dans la base de données, vous devez le mentionner dans la classe de modèle en passant la valeur "GenerationType.AUTO" dans l'attribut "strategy" au sein de l'annotation @GeneratedValue. Le code devient alors le suivant.

@Entity
public class Operator{

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

  private String username;

  private String password;

  private Integer active;

  //Getters and setters...
}

1voto

Jorge Points 11

Comme l'a répondu pascal, si vous avez besoin d'utiliser .AUTO pour une raison quelconque, il vous suffit d'ajouter les propriétés de votre application :

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto = update

0voto

Mohan Reddy Points 1

Je suis confronté au même problème, mais je me suis finalement rendu compte que je m'étais connecté à une base de données différente.

identidad supporte les colonnes d'identité dans DB2, MySQL, MS SQL Server, Sybase et HypersonicSQL. L'identifiant 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X