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

Hibernate Java Discussion :

[heritage] changement d'objet


Sujet :

Hibernate Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 45
    Points : 35
    Points
    35
    Par défaut [heritage] changement d'objet
    Bonjour

    j'ai un objet A qui a une relation one-to-one avec un objet B.
    jusque la rien de bien de complique sauf que B est une classe abstraite et B1,B2,B3 des classes qui en hérite.
    j'arrive a affecter a A un object B1 , ou B2, ou B3. il me le sauvegarde bien en me créant de id. mais maintenant je voudrai modifier A en changement l'objet B
    le save se passe bien mais hélas l'ancien objet B qui lui été attaché reste dans la base
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    @Entity
     class A {
     	@Id 
     	int id;
     	@one-to-one
     	B value;
     }
     
    @Entity
    @Table(name="b")
    @Inheritance (strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn( name="typeB", discriminatorType=DiscriminatorType.STRING)
     abstract class B{
     	@Id
     	int id;
     	@one-to-one(mappedBy="b")
     	A valueA;
     
     }
    @Entity
    @DiscriminatorValue("B1")
     classe B1 extends B{
     ...
     }
     
    @Entity
    @DiscriminatorValue("B2")
     classe B2 extends B{
     ...
     }
     
     
     
    exemple de code :
    A a = new A();
    B b1 = new B1();
    a.setB(b1);
    b1.setA(a);//je sais pas si c'est nécessaire car la relation est unidirectionnel
    save(a);
    // cree un enregistrement de b1 avec id = 1
    //cree un enregistrement de a avec id = 1 et b_id = 1
    // tout est ok 
     
    B b2 = new B2();
    a.setB(b2);
    save(a)
    // cree un enregistrement de b2 avec id = 2
    //ne fait rien avec b1 
    //misa a jour de b_id=2
    en faite je voudrai supprimer l'ancien object pour evité de surcharge la base.
    l'ideal serai que A et B ai le meme Id comme cela il ferai un update de l'enregistrement ( ou peut etre un delete + insert comme hibernate le fait si bien )mais je n'arrive pas avec mon GenericGenerator(strategy="foreign") car il veu enregistre B d'abord et donc prendre l'id de A qui est 0 et donc ca plante.
    merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    Citation Envoyé par okydo Voir le message
    Bonjour

    j'ai un objet A qui a une relation one-to-one avec un objet B.
    jusque la rien de bien de complique sauf que B est une classe abstraite et B1,B2,B3 des classes qui en hérite.
    j'arrive a affecter a A un object B1 , ou B2, ou B3. il me le sauvegarde bien en me créant de id. mais maintenant je voudrai modifier A en changement l'objet B
    le save se passe bien mais hélas l'ancien objet B qui lui été attaché reste dans la base
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    @Entity
     class A {
     	@Id 
     	int id;
     	@one-to-one
     	B value;
     }
     
    @Entity
    @Table(name="b")
    @Inheritance (strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn( name="typeB", discriminatorType=DiscriminatorType.STRING)
     abstract class B{
     	@Id
     	int id;
     	@one-to-one(mappedBy="b")
     	A valueA;
     
     }
    @Entity
    @DiscriminatorValue("B1")
     classe B1 extends B{
     ...
     }
     
    @Entity
    @DiscriminatorValue("B2")
     classe B2 extends B{
     ...
     }
     
     
     
    exemple de code :
    A a = new A();
    B b1 = new B1();
    a.setB(b1);
    b1.setA(a);//je sais pas si c'est nécessaire car la relation est unidirectionnel
    save(a);
    // cree un enregistrement de b1 avec id = 1
    //cree un enregistrement de a avec id = 1 et b_id = 1
    // tout est ok 
     
    B b2 = new B2();
    a.setB(b2);
    save(a)
    // cree un enregistrement de b2 avec id = 2
    //ne fait rien avec b1 
    //misa a jour de b_id=2
    en faite je voudrai supprimer l'ancien object pour evité de surcharge la base.
    l'ideal serai que A et B ai le meme Id comme cela il ferai un update de l'enregistrement ( ou peut etre un delete + insert comme hibernate le fait si bien )mais je n'arrive pas avec mon GenericGenerator(strategy="foreign") car il veu enregistre B d'abord et donc prendre l'id de A qui est 0 et donc ca plante.
    merci d'avance
    vous devez gérer l'effacement de l'ancien B vous-même…
    ce qui est gênant car le POJO n'est pas censé savoir comment on efface un objet du repository…
    (il y a des solutions via interceptor … ou AOP…)

    pour les relations OneToMany il y a
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    mais il faut vérifier si cela fonctionne avec le OneToOne…
    au cas où OneToOne ne supporterait pas le DELETE_ORPHAN vous pourriez toujours transformer votre OneToOne en OneToMany en ajoutant le code qui garantirait qu'il n'y ait toujours qu'un seul objet dans la collection…

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 45
    Points : 35
    Points
    35
    Par défaut
    merci je vais tester le one-to-many il me semble qu'il y a une option "unique". par contre le delete_orphan j'ai déjà essayer et cela ne marche pas

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 957
    Points : 4 386
    Points
    4 386
    Par défaut
    Citation Envoyé par okydo Voir le message
    merci je vais tester le one-to-many il me semble qu'il y a une option "unique". par contre le delete_orphan j'ai déjà essayer et cela ne marche pas
    delete_orphan marche avec le oneToMany...

    le "unique" est une option côté many-to-one... à utiliser quand l'autre côté est one-to-one...

    mais cela concerne le mapping via .hbm... et comme j'utilise plutôt les annotations... que quelqu'un de plus habitué que moi à cette façon de configurer le mapping vous éclaire...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 45
    Points : 35
    Points
    35
    Par défaut
    pour en finir je supprimer moi même l'ancien B lors de la sauvegarde de A

    pour A et B un simple @onetoone des deux cotés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void save(A a)
      //je recherche la liste des B retatché a A 
      Collection<B> col =findB(a);
      session.save(a);
      session.deleteAll(col);
    }
     
    public Collection<B> find b(A a){
      DetachedCriteria request = DetachedCriteria.forClass(B.class);
      request.add(Restrictions.eq("a", a));
      List<B> resultat=(List<B>) session.findByCriteria(request);
      return resultat;
    }
    par contre le delete doit se faire après car sinon il y a un problème de contrainte car dans la base A est encore rataché a l'ancien B

Discussions similaires

  1. Tracking de changements d'objets
    Par mohamedimli dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 22/08/2012, 10h29
  2. Réponses: 5
    Dernier message: 16/12/2010, 09h08
  3. changement d'objet social de mon entreprise
    Par zhorgy dans le forum Droit du travail
    Réponses: 2
    Dernier message: 04/11/2008, 19h07
  4. [POO] changement nom objet
    Par melou dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/10/2005, 08h44
  5. DB objet sous types heritage
    Par smex dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 15/06/2004, 21h58

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