-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: Pb de Mapping
PostPosted: Mon Jan 16, 2006 11:12 am 
Newbie

Joined: Mon Jan 16, 2006 10:49 am
Posts: 12
Bonjour

Je dois accéder une ancienne base de données sous AS400 qui a quelques particularités par rapport à ce que nous connaissons aujourd’hui. Du coup je n’arrive pas à réaliser mon mapping. Je pense que mon problème vient du fait que les clés étrangères ne portent pas le même nom que les clés primaires, le tout mélangé à l’utilisation de clé composite, et me voila perdu.

J’ai les 2 tables suivantes

Table FOURN {
IdBase
IdFourn1
Lib
Prop}
Le couple (IdBase, IdFourn1) constitue la clé primaire

Table ESCP {
IdBase
IdFourn2
IdEscp2
Info
}
Le triplet (IdBase, IdFourn2, IdEscp2) constitue la clé primaire
Et le couple (IdBase, IdFourn2) est une clé étrangère sur FOURN


J’ai construie les 2 objets

Class Fournisseur {
protected static class Id {
protected String idBase
protected String idFourn
+getter, setter, equals, hascode etc
}
protected String Lib
protected String Prop
protected Set escp
+getter, setter, equals, hascode etc

}

Class Escp {
protected static class Id {
protected String idBase
protected String idFourn
protected String idEscp
+getter, setter, equals, hascode etc
}
protected String Info
+getter, setter, equals, hascode etc

}

Et le mapping de la classe Fournisseur et Escp hors la collection

<class name="Fournisseur" table="TABLEFOUR">

<composite-id name="id" class="Fournisseur$Id">
<key-property name="idBase" column=IdBase "/>
<key-property name="idFourn" column="IdFourn1 "/>
</composite-id>

<property name="Lib" column="Lib" />
<property name="Prop" column="Prop" />
</class>

<class name="Escp" table="TABLEESCP">
<composite-id name="id" class="Escp$Id">
<key-property name=" idBase " column="IdBase "/>
<key-property name=" idFourn " column="IdFourn2 "/>
<key-property name="idEscp" column="IdEscp2"/>
</composite-id>

<property name="Info" column="ZZINFO" />
</class>

Je voudrais ajouter au mapping de Fournisseur une collection de Escp mais je n’arrive pas à écrire le <set> Je n’ai trouvé aucun exemple mettant en œuvre ce type de clé étrangère, Quelqu’un peut il m’aider ? Parce que là je suis coincé.

Merci d’avance


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 20, 2006 1:21 pm 
Newbie

Joined: Sun Jan 15, 2006 4:39 pm
Posts: 6
Bonjour,

essayez le suivant:

Fournisseur:
Code:
package composite;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;

public class Fournisseur implements Serializable {
   private String idBase;  // PK
   private String idFourn; //PK
   private String lib;
   private String prop;
   
   public Fournisseur() {      
   }
   
   public Fournisseur(String base, String id) {
      this.idBase = base;
      this.idFourn = id;
   }
   
   
   Collection escapades = new HashSet();
   
   public Fournisseur addEscp(Escp escp) {
      getEscapades().add(escp);
      escp.setFournisseur(this);
      return this;
   }
   
   
   public String getIdBase() {
      return idBase;
   }
   public void setIdBase(String idBase) {
      this.idBase = idBase;
   }
   public String getIdFourn() {
      return idFourn;
   }
   public void setIdFourn(String idFourn) {
      this.idFourn = idFourn;
   }
   public String getLib() {
      return lib;
   }
   public void setLib(String lib) {
      this.lib = lib;
   }
   public String getProp() {
      return prop;
   }
   public void setProp(String prop) {
      this.prop = prop;
   }
   
   public String toString() {
      return idBase + " " + idFourn + " " + lib;
   }
   public Collection getEscapades() {
      return escapades;
   }
   public void setEscapades(Collection escapades) {
      this.escapades = escapades;
   }
   
}


mapping:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="composite.Fournisseur" table="FOURN">

<composite-id>
<key-property name="idBase" column="idBase"/>
<key-property name="idFourn" column="idFourn1"/>
</composite-id>


<!-- simple props -->
<property name="lib"/>

<property name="prop"/>

<!-- a set of escp -->

<set name="escapades" inverse="true" lazy="true" cascade="all">
<key>
<column name="idBase"/>
<column name="idFourn2"/>
</key>
<one-to-many class="composite.Escp"/>
</set>

</class>
</hibernate-mapping>

Escp:
Code:
package composite;

import java.io.Serializable;

public class Escp implements Serializable {
   
   private String idBase;
   private String idFourn;
   private String idEscp;
   private String info;
   
   private Fournisseur fournisseur;
   
   public Escp() {      
   }
   
   public Escp(Fournisseur fournisseur) {
      setFournisseur(fournisseur);
   }
   
   public String getIdBase() {
      return idBase;
   }
   public void setIdBase(String idBase) {
      this.idBase = idBase;
   }
   public String getIdEscp() {
      return idEscp;
   }
   public void setIdEscp(String idEscp) {
      this.idEscp = idEscp;
   }
   public String getIdFourn() {
      return idFourn;
   }
   public void setIdFourn(String idFourn) {
      this.idFourn = idFourn;
   }
   public String getInfo() {
      return info;
   }
   public void setInfo(String info) {
      this.info = info;
   }
   public Fournisseur getFournisseur() {
      return fournisseur;
   }
   public void setFournisseur(Fournisseur fournisseur) {
      this.fournisseur = fournisseur;
      this.idBase = fournisseur.getIdBase();
      this.idFourn = fournisseur.getIdFourn();
   }
   
   public String toString() {
      return idBase + " " + idFourn + " " + idEscp + " " + info;
   }
}



mapping:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="composite.Escp" table="ESCP">

<composite-id>
<key-property name="idBase" column="idBase"/>
<key-property name="idFourn" column="idFourn2"/>
<key-property name="idEscp" column="idEscp2"/>
</composite-id>

<!-- simple props -->
<property name="info"/>


<!-- fournisseur -->
<many-to-one name="fournisseur" class="composite.Fournisseur" insert="false" update="false">
<column name="idBase"/>
<column name="idFourn2"/>
</many-to-one>

</class>
</hibernate-mapping>

Exemple d'usage:

Code:

package composite;

import io.CollectionDumper;
import io.HibernateUtil;

import org.hibernate.*;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import junit.framework.TestCase;

public class LoadFournisseurTestCase extends TestCase {
   private static Log log = LogFactory.getLog(LoadFournisseurTestCase.class);
   
   protected Session s;
   
   protected void setUp() throws Exception {
      super.setUp();
      s = HibernateUtil.getSession();
      HibernateUtil.beginTransaction();
   }

   protected void tearDown() throws Exception {
      super.tearDown();
      HibernateUtil.commitTransaction();
   }

   public LoadFournisseurTestCase(String arg0) {
      super(arg0);
   }

   public void testLoad() {
      Fournisseur f = new Fournisseur();
      f.setIdBase("base1");
      f.setIdFourn("cocacola");      
      Fournisseur fload = (Fournisseur)s.get(Fournisseur.class, f);
      log.error("loaded f: " + fload);
      CollectionDumper.dump(log, fload.getEscapades());
   }
   
   public void testSave() {
      Fournisseur fload = (Fournisseur)s.get(Fournisseur.class, new Fournisseur("base1", "cocacola"));
      Escp escp = new Escp();
      escp.setInfo("some nice info");
      escp.setIdEscp("escpIdXXX" + new java.util.Date());
      fload.addEscp(escp);
      s.update(fload);      
   }
}



Ce qui reste est de realiser les operation equals() et hashMap() de la classe Escp sur le cles (idBase, idFourn, idEscp), afin de la faire adequate pour la classe java.util.Set.

Je vous conseillerais d'acheter le livre "Hibernate in Action", beaucoup de chose utile se trouvent la.


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 23, 2006 6:23 am 
Newbie

Joined: Mon Jan 16, 2006 10:49 am
Posts: 12
Bonjour

Merci beaucoup pour ta réponse, c’est claire et très détaillé. Cela correspond à un de mes essais, que j’ai donc repris ce matin mais hélas hibernate ne semble pas accepter le mapping et m’insulte lors de la validation des foreign key.
Je vais continuer à chercher en sachant maintenant que c’est la bonne direction.

INFO: processing foreign key constraints
java.lang.NoClassDefFoundError

cela ressemble à une faute de frappe sur un nom de classe mais helas il n’y en a pas. Vu le peut de verbe utiliser par Hibernate, ça va être dur :-)

Merci encore


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.