Hibernate, modifier l'identificateur/clé primaire
Je reçois l'exception suivante quand je suis en train de modifier mon @ID
dans un @Entity
.
identifier of an instance of com.google.search.pagerank.ItemEntity was altered from 1 to 2.
Je sais que je suis en modifiant la clé primaire de ma table. Je suis en utilisant JPA-annotations.
J'ai résolu ce problème en utilisant cette simple requête HQL: update Table set name=:newName where name=:oldName
Au lieu d'utiliser le plus OO approche:
beginTransaction();
T e = session.load(...);
e.setName(newName);
session.saveOrUdate(e);
commit();
Une idée de ce que la diff est?
- Sont que vous essayez d'utiliser une autre entité que PK?
- maintenant, j'essaie de changer mon la clé privée à partir d'un persitent entité. en sql, il serait quelque chose comme: "mise à jour de Clients set customerId = 1492 où customer_id = 42;" et customer_id est ma clé privée
Vous devez vous connecter pour publier un commentaire.
Je ne peux pas imaginer pourquoi vous voulez le faire. À tous. Pourquoi voudriez-vous changer d'une entité de l'identité? Vous auriez également besoin de mettre à jour toutes les clés étrangères dans d'autres tables qui pointent vers elle. Semble comme une douleur, aucun gain. Vous êtes probablement mieux de faire une "clé d'entreprise" (plaine de la propriété) et à l'aide d'un plus permanent clé de substitution. J'ai le sentiment que vous allez au sujet de cette tout faux, mais si vous insistez...
Essentiellement à ce que vous êtes en train de faire est de créer un nouveau Client et la suppression de l'ancien, et c'est ainsi que j'aimerais accomplir dans Hibernate.
[pseudo]
Cependant, vous êtes probablement mieux de le faire en une seule fois dans une plaine seule transaction SQL, et dans les deux cas, le risque d'avoir des processus parallèles qui ont déjà une instance de "vieux" Client", ce qui pourrait provoquer des erreurs.
En fait, selon la spécification JPA il est interdit de changer de clé primaire:
(à partir de persistance EJB 3 (JPA) la spécification, paragraphe 2.1.4)
Mon ami,
vous êtes de droite. Il n'y a aucun moyen (ou je ne sais pas un moyen) pour modifier la clé primaire sans l'aide de requêtes HQL consolidés. Il n'est pas normal, mais c'est vrai.
Ce n'est pas une solution, comme je le crois, qui a été répondu ci-dessus.
Cependant, j'ai voulu offrir ce que je considère être un scénario de vouloir le faire. (Commentaires bienvenus)
1) Table USER_ELECTRONICS a plusieurs-à-plusieurs avec la Table ELECTRONICS_DEF
2) Ce plusieurs-à-plusieurs est une liste ordonnée. Chaque USER_ELECTRONIC_ID a une liste hiérarchisée de ELECTRONICS_DEF_IDs. Par exemple, j'ai un IPhone, un IPad, un Téléphone Cellulaire, et je les classer par ordre de combien je les aime. Pour ce faire, j'ai USER_ELEC_PRIORITY_MAP table, qui ressemble à ceci -
USER_ELEC_ID
ELEC_DEF_ID
PRIORITY
1
IPAD
1
1
IPHONE
2
1
CELL
3
USER_ELEC_ID, et ELEC_DEF_ID sont PFKs. La PRIORITÉ est Composite FK.
3) Quand je veux reoder la table en termes de préférences (Mon nouvel IPad2 est haut sur la liste, et l'iPad se déplace à #4), j'ai besoin de mettre à jour la partie du Composite FK (PRIORITÉ).