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 :

Problème mapping avec une collection Map


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Profil pro
    enseignant
    Inscrit en
    Juillet 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : enseignant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 33
    Par défaut Problème mapping avec une collection Map
    Voilà
    j'ai 2 classes : Order et Product
    dans Order, j'ai une HashMap avec comme key une référence vers un objet Product
    et comme value un Integer(la quantité)

    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;
    import java.util.HashMap;
    import java.util.Map;
    public class Order {
    	private Integer id;
    	private String nbr;
    	private Map<Product,Integer> product = new HashMap<Product,Integer>();	
    	public Order() {
    			}
     
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
     
    	public String getNbr() {
    		return nbr;
    	}
    	public void setNbr(String nbr) {
    		this.nbr = nbr;
    	}	
     
    	public Map<Product, Integer> getProduct() {
    		return product;
    	}
    	public void setProduct(Map<Product, Integer> product) {
    		this.product = product;
    	}
     
    	public void addProduct(Product p, Integer q){		
    		this.product.put(p, q);
    	}
     
    }
    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
    package test;
    public class Product {	
    	private Integer id;
    	private String ref;
    	private String name;
    	private Double price;
    	public Product() {
    			}
     
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}	
     
    	public String getRef() {
    		return ref;
    	}
    	public void setRef(String ref) {
    		this.ref = ref;
    	}	
     
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}	
     
    	public Double getPrice() {
    		return price;
    	}
    	public void setPrice(Double price) {
    		this.price = price;
    	}
     
    }
    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
    package test;
    import net.hpph.util.HibernateUtil;
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    public class Main {
    	public static void main(String[] args) {
    		Session session = HibernateUtil.getSessionFactory().openSession();
    		Transaction transaction = null;
    		Product p1,p2;
    		Order o;		
    		try {
    			transaction = session.beginTransaction();	
     
    			p1 = new Product();
    			p1.setRef("X45896");
    			p1.setName("printer HP");
    			p1.setPrice(100.55);
    			p2 = new Product();
    			p2.setRef("X458589");
    			p2.setName("HardDisk 1Tera");
    			p2.setPrice(70.55);
    			session.persist(p1);
    			session.persist(p2);			
    			o = new Order();
    			o.setNbr("Fact10589");
    			o.addProduct(p1, new Integer(10));
    			o.addProduct(p2, new Integer(50));			
    			session.persist(o);	
    			transaction.commit();
    		} 
    		catch (HibernateException e) {
    			transaction.rollback();
    			e.printStackTrace();
    		} 
    		finally {
    			session.close();
    		}
    	}
    }
    la database
    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
    CREATE TABLE IF NOT EXISTS `order` (
      `ORDERID` int(11) NOT NULL AUTO_INCREMENT,
      `NUMBER` varchar(100) COLLATE latin1_general_ci NOT NULL,
      PRIMARY KEY (`ORDERID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;
    CREATE TABLE IF NOT EXISTS `order_product` (
      `ORDER_ORDERID` int(11) NOT NULL,
      `PRODUCT_PRODUCTID` int(11) NOT NULL,
      `QUANTITY` int(11) NOT NULL,
      PRIMARY KEY (`ORDER_ORDERID`,`PRODUCT_PRODUCTID`),
      KEY `fk_ORDER_has_PRODUCT_PRODUCT1` (`PRODUCT_PRODUCTID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
    CREATE TABLE IF NOT EXISTS `product` (
      `PRODUCTID` int(11) NOT NULL AUTO_INCREMENT,
      `REF` varchar(100) COLLATE latin1_general_ci NOT NULL,
      `NAME` varchar(100) COLLATE latin1_general_ci NOT NULL,
      `PRICE` double NOT NULL,
      PRIMARY KEY (`PRODUCTID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;
    les fichiers de configuration
    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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping SYSTEM
      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="test">
      <class name="Product" table="PRODUCT">
    	    <id name="id" column="PRODUCT_ID">
          <generator class="native"/>
      	</id>  	
    		<property
    			name="ref"
    			column="REF"
    			type="string"
    			not-null="true"
    			length="50"
    		/>
    		<property
    			name="name"
    			column="NAME"
    			type="string"
    			not-null="true"
    			length="100"
    		/>
    		<property
    			name="price"
    			column="PRICE"
    			type="double"
    			not-null="true"
    		/>		
      </class>
    </hibernate-mapping>
    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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping SYSTEM
      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping package="test">
      <class name="Order" table="ORDER">
    	    <id name="id" column="ORDER_ID">
          <generator class="native"/>
      	</id>
      	<property
    			name="nbr"
    			column="NUMBER"
    			type="string"
    			not-null="true"
    			length="100"
    		/>
     
    	<map name="product" cascade="save-update,persist" lazy="true">
        <key column="ORDER_ORDERID" />
    	<index-many-to-many column="PRODUCT_PRODUCTID" class="Product"/>
    	<many-to-many column="QUANTITY" class="Product" fetch="select"/>
      </map>	  	
      </class>
    </hibernate-mapping>
    je pense que la définition de la colonne QUANTITY n'est pas bonne
    merci pour vos commentaires
    je suis bloqué pour mon projet ...

    voilà l'erreur affiché par Eclipse

    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
    Hibernate:
    /* insert test.Product
    */ insert
    into
    PRODUCT
    (REF, NAME, PRICE)
    values
    (?, ?, ?)
    Hibernate:
    /* insert test.Product
    */ insert
    into
    PRODUCT
    (REF, NAME, PRICE)
    values
    (?, ?, ?)
    Hibernate:
    /* insert test.Order
    */ insert
    into

    ORDER (NUMBER
    )
    values
    (?)
    org.hibernate.exception.SQLGrammarException: could not insert: [test.Order]
    un grand merci pour votre lecture

  2. #2
    Membre éprouvé Avatar de dev_2007
    Profil pro
    Inscrit en
    Août 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2007
    Messages : 98
    Par défaut
    Cette erreur indique que la liaison appropriée SLF4J n'a pas pu être trouvé dans le classPath. Il faut donc placer et une seule librairie de SLF4J-nop.jar, SLF4J-simple.jar, SLF4J-log4j12.jar, SLF4J-jdk14.jar ou logback-classic.jar dans le classPath et le problème devrait être résolu.

  3. #3
    Membre averti
    Profil pro
    enseignant
    Inscrit en
    Juillet 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : enseignant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 33
    Par défaut
    c'est un problème de config du Logger
    mais n'est pas là le problème
    (je suis occupé à faire des tests avec le mapping des classes)
    il y avait un petit problème au niveau des ID pour le mapping
    PRODUCTID au lieu de PRODUCT_ID
    ORDERID au lieu de ORDER_ID

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <class name="Product" table="PRODUCT">
    	    <id name="id" column="PRODUCTID">
          <generator class="native"/>
      	</id>
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <class name="Order" table="ORDER">
    	    <id name="id" column="ORDERID">
          <generator class="native"/>
      	</id>
    mais, si je mets en commentaire tout le code pour la map
    dans la classe Order (modifier également le fichier de config)
    et je n'insère qu'un record dans les 2 tables ORDER et PRODUCT
    il me donne toujours la même erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Hibernate: 
        /* insert test.Order
            */ insert 
            into
     
            ORDER (NBPRODUCT
            ) 
        values
            (?)
    org.hibernate.exception.SQLGrammarException: could not insert: [test.Order]
    par contre , l'insertion seule des produits fonctionne bien.
    A ce niveau, c'est simplement une correspondance entre classe et table??

    A+

Discussions similaires

  1. [Hibernate] mapping d'une collection
    Par Jorus dans le forum Hibernate
    Réponses: 22
    Dernier message: 01/12/2008, 17h16
  2. [Debutant]Mapping pour une collection
    Par maxattack dans le forum Hibernate
    Réponses: 14
    Dernier message: 14/06/2007, 10h59
  3. Erreur MySQL suite au mapping d'une collection
    Par K-Kaï dans le forum Hibernate
    Réponses: 8
    Dernier message: 08/06/2007, 15h48
  4. la tag logic iterate avec une liste Map
    Par casawi dans le forum Struts 1
    Réponses: 9
    Dernier message: 07/03/2007, 20h27
  5. Problème de fonction "const" avec une std::map
    Par Clad3 dans le forum SL & STL
    Réponses: 3
    Dernier message: 02/01/2007, 12h38

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