2009-09-01 7 views
1

Im essayant de supprimer une entité qui a une PK unique comme: 80253Suppression d'une entité, mais en utilisant la même clé primaire d'ajouter une entité similaire après la suppression

je supprimer cette entité en faisant les lignes suivantes de code :

myEntityType1 = getEntityManager().find(MyEntityType1.class, 80253); 
getEntityManager().remove(myEntityType1); 
getEntityManager().flush(); 

Ces bits de code supprime en fait les lignes de ma base de données et tous ses objets en cascade correctement, et je suis très heureux à ce sujet. Maintenant, le problème se produit quand j'ai maintenant besoin de créer une entité similaire qui utilise la même clé primaire (qui devrait maintenant aller droit?).

MyEntityType2 myEntityType2 = new MyEntityType2(); 
myEntityType2.copyData(myEntityType1); //access the data from the other object 
//and retrieves the id 80253. myEntityType2 now has 80253 as ID. 
getEntitymanager().persist(myEntityType2); 

Maintenant, c'est là que j'obtiens une erreur SQL unique de contrainte. Im essayant d'insérer un ID qui existe déjà et les modifications sont automatiquement annulées (l'ancienne entité n'est plus supprimée). Cela arrive après que je vois dans mon enregistreur que toplink a supprimé les enregistrements de l'ancienne entité.

Est-ce que quelqu'un sait comment cela se produit, et pourquoi cela ne fonctionne pas? Pour l'anecdote, j'ai essayé de fusionner, fermer, effacer le entityManager, mais rien ne semble fonctionner.

Il me semble que JPA pourrait faire une mauvaise mise en cache ou quelque chose. J'espère que quelqu'un a une bonne réponse pour moi! =)

Mise à jour: Theres plus un problème avec des contraintes d'identification uniques, mais je crée une nouvelle sous-classe avec la même clé primaire qui a été supprimé, je reçois l'exception suivante:

Exception Description: Trying to invoke [setApprovedWhen] on the object [null]. The 
number of actual and formal parameters differs, or an unwrapping conversion has failed. 
Internal Exception: java.lang.IllegalArgumentException: object is not an instance of 
declaring class 

Il semble pour moi que ça ne me laisse pas changer l'objet dans une sous-classe différente?

Répondre

2

EDIT: Essayez avec explicitement démarrer et valider la transaction.

Suppression d'une entité est aussi simple que appelant la méthode EntityManager supprimer (entité Object) comme exemple suivant montre. L'entité que vous supprimez doit être gérée, c'est-à-dire qu'elle doit avoir été précédemment lue dans le contexte de persistance .

entityManager.getTransaction().begin(); 
myEntityType1 = getEntityManager().find(MyEntityType1.class, 80253); 
getEntityManager().remove(myEntityType1); 
entityManager.getTransaction().commit(); 

Une fois la transaction terminée, ou vous appelez la méthode EntityManager flush(), l'entité sera supprimé. Dans un contexte de persistance gérée par conteneur , les limites de transaction seront contrôlées par le conteneur.

+0

Dans le code ci-dessus éleminez myEntityType1 comme ceci:. myEntityType1 = getEntityManager() trouver (MyEntityType1.class, 80253); getEntityManager(). Remove (myEntityType1); getEntityManager(). Flush(); –

+0

Vous copiez l'objet avant de supprimer le reight? –

+0

L'objet lui-même n'est jamais supprimé, mais il ne devrait plus exister dans la base de données à droite? Donc, JPA appelle la requête INSERT INTO le PK ne devrait plus être dans la base de données. Je viens de découvrir ceci: "Tout comme avec les méthodes de persistance et de fusion, le DELETE (em.remove) n'est pas nécessairement émis immédiatement, mais il est garanti qu'il sera émis à un moment donné. "... C'est peut-être là que ma logique échoue.J'ai pensé que flush le forcerait à courir tout de suite? –

Questions connexes