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 :

PropertyAccessException & IllegalArgumentException à l'appel d'un setter


Sujet :

Hibernate Java

  1. #1
    Membre régulier

    Inscrit en
    novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut PropertyAccessException & IllegalArgumentException à l'appel d'un setter
    Bonsoir,

    Voilà 2 jours que je cherche une solution, sans succès. Dans ma Bdd existante (postgresql), j'ai des tables qui contiennent des champs de type Character Y ou N pour illustrer une sorte de booléens.

    Du côté objet, j'ai cherché à transformer automatiquement ces java.lang.Character en booléens. J'ai donc utilisé la classe abstraite org.hibernate.type.CharBooleanType que j'ai étendue ainsi :
    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
     
    import org.hibernate.type.CharBooleanType;
     
    public class Char2BooleanType extends CharBooleanType {
     
    	@Override
    	public String getFalseString() {
    		return "N";
    	}
     
    	@Override
    	public String getTrueString() {
    		return "Y";
    	}	
    }

    J'ai également modifié (voir plus bas) les fichiers de mapping hbm.xml correspondant aux 2 classes impactées. À la base, j'ai généré les classes java et les fichiers de mapping depuis un reverse engineering de la base de données grâce à Hibernate Tools.

    Avant de faire cette modification de Character en boolean, je n'avais pas de problème, mais depuis que j'ai rajouté cette classe et que j'ai modifié les classes et mappings j'ai une erreur. Ce qui est bizarre, c'est que lorsque j'appelle une première fois dans l'application le projetRight en question, j'ai l'erreur qui est lancée, mais les fois suivantes, le chargement de l'objet se fait correctement et l'application ne renvoie plus d'erreur.

    Voici l'erreur que j'obtiens :
    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
    68
    69
    70
    71
    72
    73
    74
    75
    getting ProticProjectRight instance with id: main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRightId@7628
    Debug - Entrée try/catch...
    Exception de type runtime : IllegalArgumentException occurred while calling setter of main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRight.canUpdate
    org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRight.canUpdate
    	at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:128)
    	at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:352)
    	at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:232)
    	at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3580)
    	at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:152)
    	at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:877)
    	at org.hibernate.loader.Loader.doQuery(Loader.java:752)
    	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
    	at org.hibernate.loader.Loader.loadEntity(Loader.java:1885)
    	at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71)
    	at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65)
    	at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3062)
    	at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434)
    	at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415)
    	at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165)
    	at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:223)
    	at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126)
    	at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:906)
    	at org.hibernate.impl.SessionImpl.get(SessionImpl.java:843)
    	at main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRightHome.findById(ProticProjectRightHome.java:103)
    	at main.java.fr.inra.moulon.proticport.server.ServerProticPortFactory.getProject(ServerProticPortFactory.java:78)
    	at main.java.fr.inra.moulon.cxf.ProticPortCxf.getProject(ProticPortCxf.java:74)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:616)
    	at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:166)
    	at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:82)
    	at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:117)
    	at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:77)
    	at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:57)
    	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    	at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    	at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)
    	at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:95)
    	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
    	at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:89)
    	at org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:99)
    	at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:357)
    	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:146)
    	at org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:163)
    	at org.apache.cxf.transport.servlet.AbstractCXFServlet.doGet(AbstractCXFServlet.java:145)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:363)
    	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:219)
    	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:738)
    	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    	at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206)
    	at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:113)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at org.mortbay.jetty.Server.handle(Server.java:325)
    	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:535)
    	at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:859)
    	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
    	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:391)
    	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
    	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
    Caused by: java.lang.IllegalArgumentException: argument type mismatch
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:616)
    	at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:66)
    	... 61 more
    Exception message is: 
    IllegalArgumentException occurred while calling setter of main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRight.canUpdate


    Voici la classe qui renvoie l'exception, ProticProjectRightHome.java :
    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
    public class ProticProjectRightHome {
     
    	private Session					session			= HibernateUtil.getCurrentSession();
     
    [...]
     
    	public ProticProjectRight findById(main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRightId id) {
    		System.out.println("getting ProticProjectRight instance with id: " + id);
    		try {
    			System.out.println("Debug - Entrée try/catch...");
    			ProticProjectRight instance = (ProticProjectRight) session.get(
    					"main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRight", id);
    			System.out.println("Debug - Assignation instance de ProticProjectRight effectuée.");
    			if (instance == null) {
    				log.debug("get successful, no instance found");
    			}
    			else {
    				log.debug("get successful, instance found");
    			}
    			return instance;
    		}
    		catch (RuntimeException re) {
    			System.out.println("Exception de type runtime : " + re.getMessage());
    			log.error("get failed", re);
    			throw re;
    		}
    	}
     
    	public List<ProticProjectRight> findByExample(ProticProjectRight instance) {
    		try {
    			List<ProticProjectRight> results = (List<ProticProjectRight>) sessionFactory.getCurrentSession().createCriteria(
    					"main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRight").add(create(instance)).list();
    			return results;
    		}
    		catch (RuntimeException re) {
    			log.error("find by example failed", re);
    			throw re;
    		}
    	}
    }

    - ProticStatus.java :
    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
    public class ProticStatus implements java.io.Serializable {
     
    	private Char2BooleanType		isPrivate;
    	private Char2BooleanType		isObsolet;
            [...]
    	public ProticStatus() {
    	}
     
    	public ProticStatus(Char2BooleanType isPrivate,
    			Char2BooleanType isObsolet) {
    		this.isPrivate = isPrivate;
    		this.isObsolet = isObsolet;
    	}
     
    	public Char2BooleanType getIsPrivate() {
    		return this.isPrivate;
    	}
     
    	public void setIsPrivate(Char2BooleanType isPrivate) {
    		this.isPrivate = isPrivate;
    	}
     
    	public Char2BooleanType getIsObsolet() {
    		return this.isObsolet;
    	}
     
    	public void setIsObsolet(Char2BooleanType isObsolet) {
    		this.isObsolet = isObsolet;
    	}
            [...]
    }
    Et le 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
    <hibernate-mapping>
        <class name="main.java.fr.inra.moulon.proticport.server.dao.ProticStatus" table="protic_status" schema="public">
            [...]
            <property name="isPrivate" type="main.java.fr.inra.moulon.proticport.server.dao.utils.Char2BooleanType">
                <column name="is_private" length="1" />
            </property>
            <property name="isObsolet" type="main.java.fr.inra.moulon.proticport.server.dao.utils.Char2BooleanType">
                <column name="is_obsolet" length="1" />
            </property>
            [...]
        </class>
    </hibernate-mapping>
    - ProticProjectRight :
    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
    public class ProticProjectRight implements java.io.Serializable {
     
     
    	private Char2BooleanType		isPrivate;
    	private Char2BooleanType		isObsolet;
    	private Char2BooleanType		canUpdate;
    	private Char2BooleanType		canInsert;
            [...]
     
    	public ProticProjectRight() {
    	}
     
    	public ProticProjectRight(Char2BooleanType isPrivate, Char2BooleanType isObsolet, Char2BooleanType canUpdate, Char2BooleanType canInsert) {
    		this.isPrivate = isPrivate;
    		this.isObsolet = isObsolet;
    		this.canUpdate = canUpdate;
    		this.canInsert = canInsert;
                    [...]
    	}
     
    	public Char2BooleanType getIsPrivate() {
    		return this.isPrivate;
    	}
     
    	public void setIsPrivate(Char2BooleanType isPrivate) {
    		this.isPrivate = isPrivate;
    	}
     
    	public Char2BooleanType getIsObsolet() {
    		return this.isObsolet;
    	}
     
    	public void setIsObsolet(Char2BooleanType isObsolet) {
    		this.isObsolet = isObsolet;
    	}
     
    	public Char2BooleanType getCanUpdate() {
    		return canUpdate;
    	}
     
    	public void setCanUpdate(Char2BooleanType canUpdate) {
    		this.canUpdate = canUpdate;
    	}
     
    	public Char2BooleanType getCanInsert() {
    		return canInsert;
    	}
     
    	public void setCanInsert(Char2BooleanType canInsert) {
    		this.canInsert = canInsert;
    	}
            [...]	
    }
    Et le 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
    <hibernate-mapping>
        <class name="main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRight" table="protic_project_right" schema="public">
            <composite-id name="id" class="main.java.fr.inra.moulon.proticport.server.dao.ProticProjectRightId">
            [...]
            <property name="isPrivate" type="main.java.fr.inra.moulon.proticport.server.dao.utils.Char2BooleanType">
                <column name="is_private" />
            </property>
            <property name="isObsolet" type="main.java.fr.inra.moulon.proticport.server.dao.utils.Char2BooleanType">
                <column name="is_obsolet" />
            </property>
            <property name="canUpdate" type="main.java.fr.inra.moulon.proticport.server.dao.utils.Char2BooleanType">
                <column name="can_update" />
            </property>
            <property name="canInsert" type="main.java.fr.inra.moulon.proticport.server.dao.utils.Char2BooleanType">
                <column name="can_insert" />
            </property>
            [...]
        </class>
    </hibernate-mapping>


    Je n'ai pas trouvé ce qui bloque lors du premier appel de la fonction, si vous avez des suggestions, je suis toute ouïe.

    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 794
    Points
    48 794
    Par défaut
    les booleans de type y/n sont gérés en base par hibernate, t'as pas besoin de type custom. Il suffit de mettre "yes_no" comme type dans le mapping.

  3. #3
    Membre régulier

    Inscrit en
    novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut
    Ah bah oui. En effet. Ça marche parfaitement !

    Mince alors, tant de recherches pour rien ! Bon, comme ça on apprend petit à petit Hibernate, mais après vérification, le document de référence n'est pas très prolixe sur le sujet... Je vais soumettre une proposition d'ajout à la FAQ...

    Merci beaucoup tchize_ !

    Par contre, du coup, je suppose que pour la persistence de booléen pour ces champs, ça fonctionne également nativement. Mais si jamais l'on souhaite utiliser d'autres CHAR pour insérer dans la BdD, par exemple T (true) ou F (false), là il faut passer par une classe particulière de mapping ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 794
    Points
    48 794
    Par défaut
    pour T/F il y a true_false
    Je crois aussi me souvenir qu'il existe un mapping pour 1/0 sur des colonne de type number. Pour le reste faut passer par un type custom.

  5. #5
    Membre régulier

    Inscrit en
    novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    pour T/F il y a true_false
    Bien vu !

    Par contre, pas trouvé pour le mapping numérique, mais en l'occurrence, je n'en ai pas besoin.

    Merci.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 794
    Points
    48 794
    Par défaut
    "boolean" il me semble

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/06/2012, 17h21
  2. appel d'un setter par le nom de l'attribut
    Par archer dans le forum Général Java
    Réponses: 2
    Dernier message: 13/10/2010, 14h32
  3. appel d'un private setter
    Par yanis97 dans le forum Général Java
    Réponses: 9
    Dernier message: 21/01/2008, 11h47
  4. [Bean] Automatiser les appels de setters / getters
    Par shinchun dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 27/12/2004, 16h18

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