IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

JPA n’effectue pas le DELETE


Sujet :

JPA Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    décembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2013
    Messages : 26
    Points : 31
    Points
    31
    Par défaut JPA n’effectue pas le DELETE
    Bonjour,

    J'essaye d’effacer des entités de ma base de données mais la requête JPQL ne semble rien faire, pas de suppression, mais pas d'exception non plus.

    Pourtant, dans un test unitaire la requête s'exécute bien.

    J'ai pensé à un problème de transaction, une exception plus loin dans le code annulerait le delete mais j'ai annoté la méthode TransactionAttributeType.REQUIRES_NEW et le problème persiste.

    Pourtant le résultat du executeUpdate() est cohérent mais rien n'est reflété sur la base de données.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
            @Override
    	@TransactionAttribute(value=TransactionAttributeType.REQUIRES_NEW)
    	public int deleteBetweenDate(Machine<?> machine, LocalDateTime startDate, LocalDateTime endDate) {
    		Query q = em.createQuery(
    				"DELETE FROM DAT9011FileData f "
    				+ "WHERE f.date BETWEEN :startDate AND :endDate "
    				+ "AND f.machine = :machine");
    		q.setParameter("startDate",  startDate);
    		q.setParameter("endDate",  endDate);
    		q.setParameter("machine", machine);
    		int linesRemoved = q.executeUpdate();
    		em.flush();
    		return linesRemoved;
    	}
    J'utilise ce code dans GlassFish 4.1 qui utilise EclipseLink comme fournisseur JPA. Je précise que dans le code ci-dessus "linesRemoved" correspond au bon nombre de lignes qui auraient du être supprimées, mais dans la bdd, aucun changements.

    Quelqu'un aurait une idée ou une piste ?

    Merci d'avance!

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 810
    Points
    48 810
    Par défaut
    Il faudrait que tu active dans ton implémentation JPA l'affichage des commandes SQL.

    Deux possibilités:

    1) la transaction n'est pas commité mais rollback
    2) comme tu fais le DELETE en HQL mais que les entité correspondantes existent probablement dans l'entitymanager, l'autre transaction recrée ces entité lors du commit. Pour faire proprement normalement tu dois evict() les entités concernée de ton entitymanager pour qu'il n'essaie pas de les sauver.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    décembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2013
    Messages : 26
    Points : 31
    Points
    31
    Par défaut
    Bonjour tchize_ et merci pour ton aide.

    J'ai activé la journalisation pour y voir plus clair, je communiquerai les résultats des que le problème se reproduira.

    1) la transaction n'est pas commité mais rollback
    Etant donné que la méthode est annotée "TransactionAttributeType.REQUIRES_NEW" et qu'elle ne génère pas d'exception, quelle pourrait être les causes d'un rollBack ?


    2) comme tu fais le DELETE en HQL mais que les entité correspondantes existent probablement dans l'entitymanager, l'autre transaction recrée ces entité lors du commit. Pour faire proprement normalement tu dois evict() les entités concernée de ton entitymanager pour qu'il n'essaie pas de les sauver.
    Une partie des entités concernée par ce DELETE ne se trouve pas dans l'entity manager, une autre partie s'y trouve probablement. Mais aucune entité n'est supprimée.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    décembre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2013
    Messages : 26
    Points : 31
    Points
    31
    Par défaut
    C'était finalement le premier cas qui se produisait :

    1) la transaction n'est pas commité mais rollback
    Le delete affectait énormément d'entrées ( plusieurs million) et je finissait avec un :
    [ejb.tx_timeout] [javax.enterprise.system.container.ejb.com.sun.ejb.containers] [tid: _ThreadID=202 _ThreadName=ScanMachine-managedThreadFactory-Thread-14] [timeMillis: 1537773803151] [levelValue: 900] [[
    EJB5123:Rolling back timed out transaction
    J'ai contourné le problème en effectuant les delete par plus petit morceaux. Pour ceux que ça intéresse je suis tombé sur un article expliquant comment optimiser les delete/update sur beaucoup d'enregistrements :

    http://mysql.rjweb.org/doc.php/delet...ting_in_chunks

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/04/2017, 15h26
  2. Replication de bases Mysql - restriction pas de delete
    Par uvealoop dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 30/08/2007, 14h09
  3. Réponses: 5
    Dernier message: 26/04/2007, 12h26
  4. DELETE qui ne fonctionne pas
    Par pmboutteau dans le forum ASP
    Réponses: 9
    Dernier message: 14/10/2005, 13h50
  5. Les delete n'aiment pas les alias?
    Par LineLe dans le forum Langage SQL
    Réponses: 7
    Dernier message: 08/04/2005, 09h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo