Je classe d'entité annotée JPA comme:problème généré automatiquement primary_key utilisant JPA sur DerbyDB
@Configurable
@Entity
@Table(name="PLAYERS")
public class Player
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="ID")
private Integer id;
@Column(name="NAME")
private String name;
@PersistenceContext
public transient EntityManager entityManager;
...
}
Cela a bien fonctionné jusqu'à ce que je décide de créer la table avec des données Backupées YAML en utilisant la syntaxe comme:
createNativeQuery("INSERT INTO PLAYERS ...")
Après la création réussie lorsque je tente de créer une entité avec:
Player player = new Player();
player.setName("new player");
player.persist();
je suis arrivé erreur:
SQL Error: -1, SQLState: 23505
en rapport avec le chevauchement des primary_keys, parce identifiant généré pour une nouvelle entité = 1 (la même que la ligne de données récupéré depuis Backupées). Bien sûr, je peux récupérer les données du fichier de sauvegarde en utilisant la syntaxe jpa/java mais dans ce cas, je n'ai aucun contrôle sur les clés primaires des données insérées, etc. Comment résoudre ce problème? Est-il possible de mettre à jour id_generator après l'insertion de données sauvegardées?
C'est exactement ce que je voulais, fonctionne comme vous le souhaitez. Une autre solution possible que j'ai découverte est: pour modifier le champ AUTOINCREMENTVALUE dans la table SYS.SYSCOLUMNS, que DerbyDb utilise pour stocker la dernière valeur générée pour primary_key mais parce que c'est une table système, des privilèges d'administrateur sont requis. Donc, c'est une solution plus gênante. – user85005
@ user85005: Oui, cela fonctionnerait aussi (mais nécessitera plus de privilèges que vous avez remarqué). En fait, l'alter se traduira par une modification des tables système. C'est juste plus pratique d'utiliser l'alter IMO. –