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 :

[Hibernate]ManyToOne : IllegalArgumentException occurred while calling setter


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de eracius
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 138
    Par défaut ManyToOne : IllegalArgumentException occurred while calling setter
    Désolé je sais pas ce que j'ai foutu mais je voulais poster dans le forum Hibernate, si quelqu'un peut le déplacer ... --> Merci ;-)

    Bonjour,

    Dans un nouveau projet je tente de me mettre au mapping de collection et je rencontre une erreur dont je n'arrive pas à savoir si elle vient d'une étourderie ou d'un vrai problème de compréhension du fonctionnement d'Hibernate (d'utilisation du lazy loading par exemple).

    J'ai une entity Custumer qui contient une collection d'entity Soft :

    Custumer :
    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
     
    @Entity
    public class Custumer implements Serializable {
    	private int id;
    	private String login;
    	private String pass;
    	private String name;
     
    	private List<Soft> softs;
     
    	public Custumer(){
     
    	}	
     
    	@OneToMany(targetEntity=Soft.class,
                mappedBy="idcustumer")
    	public List<Soft> getSofts(){
    		return this.softs;
    	}
     
    	public void setSofts(List<Soft> softs){
    		this.softs = softs;
    	}
     
    	@Id
    	@GeneratedValue
    	public int getId (){
    		return this.id;
    	}
     
    	public void setId(int id){
    		this.id = id;
    	}
     
    et autres setter et getter ..
     
    }
    Avec comme fichier de 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
     
    <hibernate-mapping>
        <class name="data.Custumer" table="custumer" catalog="portal">
            <id name="id" type="int">
                <column name="id" />
                <generator class="identity" />
            </id>
            <property name="login" type="string">
                <column name="login" length="30" />
            </property>
            <property name="name" type="string">
                <column name="name" length="30" />
            </property>
            <property name="pass" type="string">
                <column name="pass" length="30" />
            </property>
     		<set name="softs" inverse="true" cascade="all" lazy="true">
      	  	  	<key column="idcustumer" not-null="true" />
    			<one-to-many class="data.Soft" />
      	  	</set>
        </class>
    </hibernate-mapping>
    Soft :
    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
     
    @Entity
    public class Soft implements Serializable {
     
    	private int id;
    	private String addr;
    	private String version;
     
    	private Custumer custumer;
     
    	public Soft(){
     
    	}	
     
    	@ManyToOne
    	@JoinColumn(name = "idcustumer")
    	public Custumer getCustumer(){
    		return this.custumer;
    	}	
     
    	public void setCustumer(Custumer custumer){
    		this.custumer = custumer;
    	}	
     
    	@Id
    	@GeneratedValue
    	public int getId(){
    		return this.id;
    	}
     
    	public void setId(int id){
    		this.id = id;
    	}
     
    	etc ...	
    }
    Avec comme fichier de 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
     
    <hibernate-mapping>
        <class name="data.Soft" table="soft" catalog="portal">
            <id name="id" type="int">
                <column name="id" />
                <generator class="identity" />
            </id>
            <property name="addr" type="string">
                <column name="addr" length="100" />
            </property>
            <property name="version" type="string">
                <column name="version" length="30" />
            </property>
    		<many-to-one name="custumer" class="data.Custumer" insert="false" update="false">
       			<column name="idcustumer" />
    		</many-to-one> 
        </class>
    </hibernate-mapping>
    J'ai également des DAO et des services associés mais je ne pense pas qu'il soit utile que je les mette ici. Dites moi si besoin.

    Dans un test unitaire, j'essaye simplement mes fonctions CRUD sur la classe Custumer. La base ne contient aucune entrée dans la table Softs.

    L'ajout se passe bien, j'insère trois Custumer.

    Le read plante en mettant l'erreur suivante :
    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
     
    Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 2.031 sec <<< FAILURE!
    testAddEditGetDataRemove(test.service.dao.CustumerManagerTest)  Time elapsed: 2 sec  <<< FAILURE!
    junit.framework.AssertionFailedError: custumerManager:find: IllegalArgumentException occurred while calling setter of data.Custumer.softs; nested exception is org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of data.Custumer.softs
    	at junit.framework.Assert.fail(Assert.java:47)
    	at test.service.dao.CustumerManagerTest.testAddEditGetDataRemove(CustumerManagerTest.java:84)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at junit.framework.TestCase.runTest(TestCase.java:168)
    	at junit.framework.TestCase.runBare(TestCase.java:134)
    	at junit.framework.TestResult$1.protect(TestResult.java:110)
    	at junit.framework.TestResult.runProtected(TestResult.java:128)
    	at junit.framework.TestResult.run(TestResult.java:113)
    	at junit.framework.TestCase.run(TestCase.java:124)
    	at junit.framework.TestSuite.runTest(TestSuite.java:232)
    	at junit.framework.TestSuite.run(TestSuite.java:227)
    	at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:81)
    	at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
    	at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
    	at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
    	at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338)
    	at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997)
    Est-ce que quelqu'un voit quelque chose dans mon code qui pourrait provoquer ça ?

    N'hésitez pas à me demander des précisions, je suis réactif.

    Merci d'avance pour votre aide.
    Bonne journée.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Par défaut
    Dans ton projet tu veux utiliser les annotations ou les fichiers de mappings XML ?

    Tu as le droit de surcharger tes annotations dans un fichoer xml (orm.xml), mais est-ce que c'est bien ce que tu veux faire ?

  3. #3
    Membre confirmé Avatar de eracius
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 138
    Par défaut
    En fait, comme je découvre, je suis tombé sur pas mal de bouts de code, pas toujours de la première fraicheur, et j'ai du mal à savoir si les fichiers de mapping sont nécessaires ou si je peux m'en passer en me contentant des annotations ...

    Mais pour mes premiers tests, j'avais seulement les annotations (telles qu'elles sont écrites) et ça ne fonctionnait pas mieux.

    Tu penses que le problème peut venir de cette redondance d'information ?

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 76
    Par défaut
    essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     		<set name="softs" inverse="true" cascade="all" lazy="false">
      	  	  	<key column="idcustumer" not-null="true" />
    			<one-to-many class="data.Soft" />
      	  	</set>
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     <class name="data.Soft" table="soft" catalog="portal" lazy="false">

  5. #5
    Membre confirmé Avatar de eracius
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 138
    Par défaut
    oui j'avais déjà essayé de désactiver le lazy loading, pas de changement, j'ai la même exception.

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 76
    Par défaut
    dsl

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Par défaut
    1. Fait le ménage dans ton mapping, même si ce n'est pas la source de ton erreur tu y verras plus clair. Choisis annotation ou fichier XML.

    2. remplace ta List<Soft> par un Set<Soft>, ou alors dans ton mapping remplace set par list.

  8. #8
    Membre confirmé Avatar de eracius
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 138
    Par défaut
    oui, c'est l'erreur la plus commune qui entraine cette exception. J'ai même remplacé mes Integer par des int pour être sur.

    Un export de ma bdd :

    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
     
    CREATE TABLE `custumer` (
      `id` int(11) NOT NULL auto_increment,
      `login` varchar(30) default NULL,
      `name` varchar(30) default NULL,
      `pass` varchar(30) default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
     
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `soft`
    -- 
     
    CREATE TABLE `soft` (
      `id` int(11) NOT NULL auto_increment,
      `addr` varchar(100) default NULL,
      `version` varchar(30) default NULL,
      `idcustumer` int(11) default NULL,
      PRIMARY KEY  (`id`),
      KEY `FK35F42A4865D8D9` (`idcustumer`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
     
     
    -- 
    -- Contraintes pour la table `soft`
    -- 
    ALTER TABLE `soft`
      ADD CONSTRAINT `FK35F42A4865D8D9` FOREIGN KEY (`idcustumer`) REFERENCES `custumer` (`id`);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/06/2012, 16h21
  2. [Mapping] Erreur "IllegalArgumentException occurred while calling setter of"
    Par Thibaut Marmin dans le forum Hibernate
    Réponses: 0
    Dernier message: 24/03/2012, 01h24
  3. IllegalArgumentException occurred calling getter
    Par youkoun dans le forum Hibernate
    Réponses: 2
    Dernier message: 02/07/2010, 16h00
  4. IllegalArgumentException occurred calling getter
    Par zerocoolyoussef dans le forum Hibernate
    Réponses: 1
    Dernier message: 19/01/2009, 10h10
  5. Réponses: 3
    Dernier message: 16/01/2006, 18h50

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