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 :

Matérialiser une liaison ManyToOne optionnelle


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut Matérialiser une liaison ManyToOne optionnelle
    Salut,

    Je voulais créer une relation entre deux objet Transaction et Category

    Une transaction peut avoir une catégorie (mais ce n'est pas obligatoire)
    Une catégorie est une entité pas forcémenté lié à une transaction

    Je n'ai pas créé de relation bidirectionnelle, je ne cherche pas à remonter aux transactions par les catégories.

    J'ai donc

    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
    16
    17
    18
    19
     
    @Entity
    public class Category extends Model implements Comparable<Category>
    {
    ...
    }
     
     
    @Entity
    public class Transaction extends Model
    {
     
        /**
         * Category
         */
        @Expose
        @OneToOne(cascade= {CascadeType.PERSIST, CascadeType.MERGE})
        public Category category ;
    }
    Par contre quand je supprime une catégorie, cela ne supprime pas les références à la catégorie dans les transactions.

    Du coup j'ai créé une méthode pour le delete dans Category (c'est pas élégant, j'aurais préféré que JPA s'en charge) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        public static void deleteById(long id)
        {
            // Remove this category from transaction
            Query query = JPA.em().createQuery("UPDATE Transaction t SET t.category = null WHERE t in (select tr FROM Transaction as tr where tr.category.id=:id)");
            query.setParameter("id", id);
            query.executeUpdate();
     
            // Remove childs
            delete("id",id);
        }
    Mais le set=null ne fonctionne pas. La suppression se passe parfaitement, par contre j'ai toujours une catégorie qui vient d'on ne sait ou attaché à ma transaction. Un cache quelque part ?

  2. #2
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    un petit UP suite au déplacement dans la rubrique JPA (au préalable c'était dans Play)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 20
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int affectedRows = query.executeUpdate();
    // System output like
    Logger.finest("Number of affected rows on update:" + affectedRows);
    donne-t-il un résultat > 0 ?

    Si oui le pb ne viendrait-il pas de la transaction non "committed" ?
    Si non, probablement un problème de requête. En outre puisque la méthode deleteById(long id) est static peut-être que l'utilisation d'une proc stock/NamedQuery est plus adaptée...

  4. #4
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    Pour info mon test unitaire est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        @Test 
        public void deleteChildCategoryAssociatedWithTransaction()
        {
            Category category = Category.find("byName", "cat1").first();
            assertNotNull(category);
            Category.deleteById(category.id);
     
            List<Category>categories = Category.findListOfCategories();
            assertEquals(5,categories.size());
     
            Transaction tr1 = Transaction.find("byAmount", BigDecimal.valueOf(20.0)).first();
            assertEquals(null,tr1.category);
         }
    J'ai ajouté le log que tu proposes et j'ai bien un résultat = 1 (comme prévu dans mon test. Pourtant dans la dernière ligne de mon test ma transaction est toujours lié à ma catégorie, ce qui est illogique puisque mon update a affecté 1 résultat.

    Je vais activer le mode show_sql pour voir mieux

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 20
    Par défaut
    Pas illogique dans le cadre d'une transaction. La requête peut affecter un ou plusieurs row(s) mais si la transaction n'est pas "commit/rollback" on n'a pas de modification effective. L'auto-commit n'est pas actif par défaut.

  6. #6
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    Je suis bien au sein d'une transaction et tout est commité à la fin.

    D'ailleurs j'ai bien une catégorie qui a disparu puisque mon findAll me renvoie 5 éléments :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<Category>categories = Category.findListOfCategories();
    assertEquals(5,categories.size());
    J'ai tenté aussi un flush sur EntityManager au cas ou, pas mieux.

Discussions similaires

  1. Comment créer un lien hypertexte avec une liaison OLE Excel ?
    Par vieuxsinge dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 08/12/2005, 17h16
  2. Réponses: 7
    Dernier message: 21/06/2005, 16h56
  3. comment établir une liaison usb sous visual c++ ?
    Par Baby_Chou dans le forum MFC
    Réponses: 2
    Dernier message: 03/02/2005, 08h31
  4. Opérer une liaison entre 2 DBLookup
    Par pey dans le forum Bases de données
    Réponses: 3
    Dernier message: 10/12/2004, 10h11
  5. partage d'une liaison ADSL
    Par hassen dans le forum Développement
    Réponses: 6
    Dernier message: 20/10/2003, 20h10

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