J'écris deux méthodes pour réinitialiser la base de données dans mon application. Première doit dynamiquement répertorier toutes les tables, puis les tronquer. Le deuxième est responsable du remplissage des données.Hibernate doit échouer pour réussir la prochaine fois
méthode Truncate utilise requête native:
public void truncate() throws Exception {
List<String> names = getAllTableNames();
names.forEach(tableName -> {
entityManager.createNativeQuery("TRUNCATE TABLE " + tableName + " CASCADE").executeUpdate();
});
// entityManager.setFlushMode(FlushModeType.COMMIT);
// entityManager.getEntityManagerFactory().getCache().evictAll();
entityManager.flush();
}
Deuxième méthode pour les données re-init juste parse des documents, crée des entités et les enregistre en vrac. Les deux méthodes se trouvent dans le service @Transactional
. J'ai deux extrémités pour pouvoir les appeler séparément.
Maintenant, ce qui se passe est que, après que je tronque tables (sans erreur se termine) j'appelle re-init et je reçois:
WARNING: org.springframework.dao.DataIntegrityViolationException: A different object with the same identifier value was already associated with the session : [com.nws.vedica.model.entity.DocType#ACCOUNTCONTRACTCANCEL]; nested exception is javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [com.nws.vedica.model.entity.DocType#ACCOUNTCONTRACTCANCEL]
comme si les entités étaient toujours présentes dans le cache EM. La même chose se produit après l'expulsion après le cache de EM (ligne commentée)
maintenant deux observations:
la deuxième demande 1.- pour recréer des entités est toujours Successfull.
2.- La demande de recréation est réussie À DROITE APRÈS l'opération de tronquage si je cours une nouvelle création deux fois (premier succès, deuxième échec), puis tronquer puis recréer. --very weired
Veuillez me guider sur ce qui se passe et comment faire fonctionner correctement.
Merci!
EDIT:
je remarquai que après avoir appelé
truncateDatabaseSrv.truncate();
programme
se bloque lorsque je tente de collection interroger:
List<DocType> docTypes = docTypeDAO.getAllDocTypes();
donc je mis
entityManager.createNativeQuery("COMMIT;").executeUpdate();
dans la méthode tronquée.
Maintenant, il ne va pas se bloquer et retournera tableau vide comme prévu. Mais encore quand j'appelle la collecte DocType
re-init dans la demande suivante, je reçois la même erreur que mentionné ci-dessus.
Aussi je l'ai remarqué Diry vérification qui se passe après troncature:
2:05:04,200 DEBUG AbstractFlushingEventListener:132 - Processing flush-time cascades
12:05:04,202 DEBUG AbstractFlushingEventListener:174 - Dirty checking collections
12:05:04,203 DEBUG Collections:189 - Collection found: [com.nws.vedica.model.entity.DocType.fieldValidities#ACCOUNTCONTRACTCANCEL], was: [com.nws.vedica.model.entity.DocType.fieldValidities#ACCOUNTCONTRACTCANCEL] (initialized)
12:05:04,203 DEBUG Collections:189 - Collection found: [com.nws.vedica.model.entity.DocType.keywords#ACCOUNTCONTRACTCANCEL], was: [com.nws.vedica.model.entity.DocType.keywords#ACCOUNTCONTRACTCANCEL] (initialized)
12:05:04,204 DEBUG Collections:189 - Collection found: [com.nws.vedica.model.entity.DocType.fieldValidities#ACCOUNTDEBTSLIENCONTRACT], was: [com.nws.vedica.model.entity.DocType.fieldValidities#ACCOUNTDEBTSLIENCONTRACT] (initialized)
que (initialized)
semble suspect pour moi, mais c'est tout ce que je dois cette fois ...
Je suis rouillé avec Hibernate ... Avez-vous essayé quelque chose comme: entityManager.getTransaction(). Commit()? – JFPicard
il échoue dès que vous essayez d'obtenir la forme de transaction em. avant l'opération tronquée. erreur dit quelque chose comme, tx est déjà géré .. (par @Transactional annotation je suppose) – greengold