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 :

[Mapping] probleme de compréhension


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 30
    Par défaut [Mapping] probleme de compréhension
    Bon à tous!
    voici mon probleme:

    j'ai 3 classes : A

    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
    package test;
    import java.io.Serializable;
     
    public class A implements Serializable
    {
      /**
       * 
       */
      private static final long serialVersionUID = 1L;
     
      private int _jour = 1;
      private String _nom = null;
      private B _b = null;
     
      public B getB()
      {
        return _b;
      }
      public void setB(B b)
      {
        _b = b;
      }
      public int getJour()
      {
        return _jour;
      }
      public void setJour(int jour)
      {
        _jour = jour;
      }
      public String getNom()
      {
        return _nom;
      }
      public void setNom(String nom)
      {
        _nom = nom;
      }
     
     
    }
    La classe B
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    package test;
    import java.io.Serializable;
     
    public class B implements Serializable
    {
      /**
       * 
       */
      private static final long serialVersionUID = 1L;
     
      private long   _id   = 0;
      private int    _val1 = 0;
      private double _val2 = 0;
     
      public int getVal1()
      {
        return _val1;
      }
      public void setVal1(int val1)
      {
        _val1 = val1;
      }
      public double getVal2()
      {
        return _val2;
      }
      public void setVal2(double val2)
      {
        _val2 = val2;
      }
      public long getId()
      {
        return _id;
      }
      public void setId(long id)
      {
        _id = id;
      }
     
      public boolean equals(Object object)
      {
        if (object instanceof B)
        {
          B b = (B) object;
          if (_id == b.getId() && _val1 == b.getVal1() && _val2 == b.getVal2())
            return true;
          return false;
        }
        else
          return super.equals(object);
      }
     
      public int hashCode()
      {
        int h = 0;
        h = (int) ((127 * h) + _id);
        h = (127 * h) + _val1;
        h = (int) ((127 * h) + _val2);
     
        return h;
      }
    }
    la classe C
    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
     
    package test;
     
    public class C
    {
      private String _alpha1 = null;
      private String _alpha2 = null;
      private B      _b      = null;
     
      public B getB()
      {
        return _b;
      }
      public void setB(B b)
      {
        _b = b;
      }
      public String getAlpha1()
      {
        return _alpha1;
      }
      public void setAlpha1(String alpha1)
      {
        _alpha1 = alpha1;
      }
      public String getAlpha2()
      {
        return _alpha2;
      }
      public void setAlpha2(String alpha2)
      {
        _alpha2 = alpha2;
      }
     
     
    }

    Mon programme de test:
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    import org.hibernate.Session;
    import org.hibernate.Transaction;
     
    import test.A;
    import test.B;
    import test.C;
     
    public class Main
    {
     
      /**
       * @param args
       */
      public static void main(String[] args)
      {
        Session session = HibernateUtil.currentSession();
     
        Transaction tx = session.beginTransaction();
     
     
        A a1 = getA("a1", 15, 10, 12.3);
        A a2 = getA("a2", 16, 10, 10.1);
     
        C c1 = getC("c1", "c2", 10, 10.1);
     
        session.saveOrUpdate(a1);
        session.saveOrUpdate(a2);
        session.saveOrUpdate(c1);
        //*/
        /*
        A a = (A) session.load(A.class, new String("a2"));
        session.delete(a);
        //*/
        tx.commit();
     
        HibernateUtil.closeSession();
     
      }
     
      private static C getC(String alpha1, String alpha2, int val1, double val2)
      {
        C a = new C();
        a.setAlpha1(alpha1);
        a.setAlpha2(alpha2);
     
        B b = new B();
        b.setVal1(val1);
        b.setVal2(val2);
        a.setB(b);
     
        return a;
      }
      private static A getA(String n, int jour, int val1, double val2)
      {
        A a = new A();
        a.setJour(jour);
        a.setNom(n);
     
        B b = new B();
        b.setVal1(val1);
        b.setVal2(val2);
        a.setB(b);
     
        return a;
      }
     
    }
    Mon fichier hbm.xml
    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
    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping  package="test">
     
        <class name="A" table="A">
        	<id name="nom" type="string">
        	  <column name="NOM" sql-type="char(6)" not-null="true"/>
              <generator class="assigned"/>
            </id>
            <property name="jour" column="JOUR" type="integer"/> 
     
            <many-to-one name="b" 
              column="B_ID" 
              unique="true"
              not-null="true"
              lazy="false"
              fetch="join"
              cascade="save-update,delete"/>
        </class>
     
        <class name="B" table="B">
          <id name="id" column="B_ID">        
        	<generator class="increment"/>
          </id>
          <property name="val1" column="VAL1" type="integer"/>
          <property name="val2" column="VAL2" type="double"/>
        </class>
     
     
        <class name="C" table="C">
        	<id name="alpha1" type="string">
        	  <column name="ALPHA1" sql-type="char(6)" not-null="true"/>
              <generator class="assigned"/>
            </id>
            <property name="alpha2" column="ALPHA2" type="string"/> 
            <many-to-one name="b" 
                         column="B_ID" 
    			         unique="true"
        	    		 not-null="true"
    		             lazy="false"
    		             fetch="join"
    					 cascade="save-update,delete"/>
        </class>
     
    </hibernate-mapping>
    et j'utilise hibernate pour les stocké en base.
    Or j'ai un pb avec le mapping, j'aimerais autant que possible que quand je modifie A:
    qu'hibernate ne me régère pas un nouvelle element B, alors qu'il modifie seulement l'élément A.

    Je developpe un peu pour bien me faire comprendre:
    imaginons je lance 2 fois d'affiler mon programme et que je regarde en base
    j'ai bien 2 ligne dans la table A
    1 ligne dans la table C
    et 6!!! lignes dans la table B.

    quelqu'un peu m'expliquer pourquois? et/ ou comment remedier a ce probleme, j'aimerais qu'hibernate ne modifie les éléments B rataché à A ou C, pas qu'il en crée de nouveau.

    d'avance merci

  2. #2
    Membre éprouvé
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Par défaut
    tu as
    Donc a chaque fois c'est un nouvel objet donc une nouvelle entrée hibernate

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 30
    Par défaut
    Certes, mais j'ai aussi :
    pouquois dans ce cas ne crée t'il pas un nouvel enregistrement A, au lieu de modifier l'existant?

  4. #4
    Membre éprouvé
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Par défaut
    Parceque la clé de A est son nom que tu fixes, mais que la clé de B est une clé auto-générée par hibernate en auto-incrément.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 30
    Par défaut
    Effectivement, c'est ce que je viens de tester.

    Mais d'existe t'il pas un moyen de generer une clef primaire pour B qui tiendrait compte d'un compteur et de la classe A ou C. de facon a ce que qu'en j'appelle la classe A en la modifiant, si il y a une nouvelle instance d'un objet B, ce dernier soit modifier?

  6. #6
    zev
    zev est déconnecté
    Membre expérimenté
    Inscrit en
    Octobre 2004
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 204
    Par défaut
    Si tu fais des many-to-one avec B dans tes mapping, il faut pas les traduire par des Set dans les .java ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class A implements Serializable
    {
      /**
       * 
       */
      private static final long serialVersionUID = 1L;
     
      private int _jour = 1;
      private String _nom = null;
      private Set b = new HashSet();

Discussions similaires

  1. [Probleme de Compréhension] Nom des dossier
    Par brak__ dans le forum Windows Vista
    Réponses: 9
    Dernier message: 27/02/2007, 09h37
  2. [google maps] probleme avec ie
    Par kowabounga dans le forum Général Python
    Réponses: 1
    Dernier message: 14/09/2006, 15h20
  3. Image mapping : probleme entre IE et FF
    Par avogadro dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 17/08/2006, 14h58
  4. probleme de compréhension de proxy
    Par Mut dans le forum Applications
    Réponses: 3
    Dernier message: 11/01/2006, 12h24
  5. Réseau....probleme de compréhension
    Par Mut dans le forum Administration
    Réponses: 7
    Dernier message: 10/06/2005, 16h42

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