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

GWT et Vaadin Java Discussion :

Problème de Set<Object> avec Gilead (Hibernate 4 GWT)


Sujet :

GWT et Vaadin Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 12
    Par défaut Problème de Set<Object> avec Gilead (Hibernate 4 GWT)
    Bonjour, Voici mon problème:

    J'utilise GWT 2 avec Spring et Gilead 1.3 et notamment 2 tables dans ma base de données "Animal" et "Propriétaire". Un animal a un seul propriétaire et un propriétaire peut avoir plusieurs animaux. Lorsque je sélectionne un animal, j'aimerais donc que son propriétaire soit recherché automatiquement, et lorsque je sélectionne un propriétaire, que les animaux soient recherchés automatiquement également. Je vais donc devoir utiliser un Set<Animal> dans ma classe Serializable Proprietaire et c'est là que ça bug...

    Voici donc mes fichiers de mapping:

    Animal.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
    <?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="be.ac.ulg.cvu.domain.Animal" table="cvu_animal">
        <id name="id_animal" column="ID_ANIMAL">
          <generator class="native"/>
        </id>
        <property name="num_sap" column="num_sap"/>
        <property name="boucle" column="boucle"/>
        <property name="sexe" column="sexe"/>
        <property name="race" column="race"/>
        <property name="poids" column="poids"/>
        <property name="date_naissance" column="date_naissance"/>
        <property name="decede" column="is_decede"/>
     
        <many-to-one lazy="false" name="proprietaire" column="id_proprietaire"
                     class="be.ac.ulg.cvu.domain.Proprietaire"
                     cascade="none" />
     
      </class>
    </hibernate-mapping>
    Proprietaire.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
    <?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="be.ac.ulg.cvu.domain.Proprietaire" table="cvu_proprietaire">
        <id name="id_proprietaire" column="ID_PROPRIETAIRE">
          <generator class="native"/>
        </id>
        <property name="nom"/>
        <property name="prenom"/>
        <property name="adresse"/>
        <property name="cp"/>
        <property name="localite"/>
        <property name="fixe"/>
        <property name="mobile"/>
     
        <set name="animals" cascade="all" lazy="false">
        		<key column="id_proprietaire" />
        		<one-to-many class="be.ac.ulg.cvu.domain.Animal" />
        </set> 
     
      </class>
    </hibernate-mapping>
    Mes 2 classes Serializable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Proprietaire extends net.sf.gilead.pojo.gwt.LightEntity implements Serializable {
    	
    	Long id_proprietaire;
    	String nom;
    	String prenom;
    	String adresse;
    	int cp;
    	String localite;
    	String mobile;
    	String fixe;
    	Set<Animal> animals;
    +get et set
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Animal extends net.sf.gilead.pojo.gwt.LightEntity implements Serializable {
     
    	Long id_animal;
    	int num_sap;
    	String boucle;
    	String sexe;
    	String race;
    	int poids;
    	Date date_naissance;
    	boolean decede;
    	Proprietaire proprietaire;
    +get et set
    et finallement mon webservice :

    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
    public class AnimalServiceImpl extends PersistentRemoteService implements AnimalService {
     
    	private HibernateUtil gileadHibernateUtil = new HibernateUtil();
     
    	public AnimalServiceImpl() {
     
    	    gileadHibernateUtil.setSessionFactory(be.ac.ulg.cvu.util.HibernateUtil.getSessionFactory());
     
    	    PersistentBeanManager persistentBeanManager = new PersistentBeanManager();
    	    persistentBeanManager.setPersistenceUtil(gileadHibernateUtil);
    	    persistentBeanManager.setProxyStore(new StatelessProxyStore());
     
    	    setBeanManager(persistentBeanManager);
    	}
     
    	@Override
    	public List<Animal> getAnimals() {
    	    Session session = gileadHibernateUtil.getSessionFactory().getCurrentSession();
    	    session.beginTransaction();
    	    List<Animal> animals = new ArrayList<Animal>(session.createSQLQuery("select * from cvu_animal").addEntity(Animal.class).list());
     
    	    session.getTransaction().commit();
    	    return animals;
    	}
    (be.ac.ulg.cvu.util.HibernateUtil.getSessionFactory() renvoie la session créée comme suit : sessionFactory = new Configuration().configure().buildSessionFactory(); )
    Je n'ai pas encore fait les configurations pour que Spring se charge de gérer la session à ma place..

    Je n'arrive pas à me débarrasser de cette erreur :

    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
    [WARN] Exception while dispatching incoming RPC call
    com.google.gwt.user.client.rpc.SerializationException: java.lang.reflect.InvocationTargetException
    	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:764)
    	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:727)
    	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:616)
    	at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126)
    	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:152)
    	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:534)
    	at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:616)
    	at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:474)
    	at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:571)
    	[....]
    Caused by: java.lang.reflect.InvocationTargetException
    	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 com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:746)
    	... 32 more
    Caused by: com.google.gwt.user.client.rpc.SerializationException: Type 'org.hibernate.collection.PersistentSet' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = [be.ac.ulg.cvu.domain.Animal@96b86b]
    	at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:614)

    Si quelqu'un peut m'aider, ce serait vraiment cool !

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 12
    Par défaut
    J'ai finalement intégré Gilead à Spring. Ce qui fait que la session est gérée automatiquement.

    Ajout dans applicationContext.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
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
     
            <property name="mappingLocations">
                <list>
                    <value>classpath:/be/ac/ulg/cvu/domain/Consultation.hbm.xml</value>
                    <value>classpath:/be/ac/ulg/cvu/domain/Animal.hbm.xml</value>
                    <value>classpath:/be/ac/ulg/cvu/domain/Proprietaire.hbm.xml</value>
                </list>
            </property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
                    <prop key="hibernate.show_sql">true</prop>
                    <prop key="hibernate.format_sql">false</prop>
                    <prop key="hibernate.hbm2ddl.auto">update</prop>
                </props>
            </property>
        </bean>
     
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
            <property name="dataSource" ref="dataSource"/>
    </bean>
     
    <bean id="proxySerializer" class="net.sf.gilead.core.serialization.GwtProxySerialization" />
    <bean id="proxyStore" class="net.sf.gilead.core.store.stateless.StatelessProxyStore">
    		<property name="proxySerializer" ref="proxySerializer" />
    </bean>
    <bean id="persistenceUtil" class="net.sf.gilead.core.hibernate.jpa.HibernateJpaUtil">
    		<property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <bean class="net.sf.gilead.core.PersistentBeanManager"> 
    	    <property name="proxyStore" ref="proxyStore" />
    		<property name="persistenceUtil" ref="persistenceUtil" />
    </bean>
    La partie serveur devient donc simplement:

    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
    @Service
    public class AnimalServiceImpl extends PersistentRemoteService implements AnimalService {
     
    	@Resource
        private AnimalDaoJdbc animalDao;
     
    	public AnimalDaoJdbc getAnimalDao() {
    		return animalDao;
    	}
     
    	public void setAnimalDao(AnimalDaoJdbc animalDao) {
    		this.animalDao = animalDao;
    	}
     
    	public AnimalServiceImpl() {
     
    	}
     
    	@Override
    	public List<Animal> getAnimals() {
    		return animalDao.getAll();
    	}
     
    ...
    Mais toujours le même problème qui apparait... Cette erreur est bien connue, mais pas moyen de m'en débarasser :
    Type 'org.hibernate.collection.PersistentSet' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = [be.ac.ulg.cvu.domain.Animal@1d22b42]

    Help!

  3. #3
    Membre chevronné
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Par défaut
    As tu des constructeur par defaut sur tes Pojo ?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 12
    Par défaut
    Citation Envoyé par pvoncken Voir le message
    As tu des constructeur par defaut sur tes Pojo ?
    Oui... Je me demande si je ne vais pas laisser tomber les mappings hibernate et créer manuellement des web services avec une spécification sur l'id concerné dans une autre table (Criteria)..

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut
    As-tu essayé de remplacer
    Set<Animal> animals;
    par List<Animal> animals;

  6. #6
    Membre chevronné
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Par défaut
    Le persistentSet est un proxy hibernate. Tu dois appliqer la méthode clone de Gilead sur cet attribut pour qu'il le transforme en null s'il n'a pas été chargé ou en objet réel s'il à été chargé par hibernate.

    C'est le même probleme que le perstentBag pour les list.

    Sinon tu peux définir son chargement en EAGER plutot qu'en lazy. Ca résoudra ce problème.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 12
    Par défaut
    Citation Envoyé par galel Voir le message
    As-tu essayé de remplacer par List<Animal> animals;
    Oui j'ai déjà essayé, sans succès!

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 12
    Par défaut
    Citation Envoyé par pvoncken Voir le message
    Le persistentSet est un proxy hibernate. Tu dois appliqer la méthode clone de Gilead sur cet attribut pour qu'il le transforme en null s'il n'a pas été chargé ou en objet réel s'il à été chargé par hibernate.

    C'est le même probleme que le perstentBag pour les list.

    Sinon tu peux définir son chargement en EAGER plutot qu'en lazy. Ca résoudra ce problème.
    Où, quand et comment dois-je appliquer cette méthode clone ? Merci

    Sinon, je me demande s'il ça sert à quelque chose que je perde mon temps sur ce problème. Je peux très bien charger tous les propriétaires dans une grille, puis lorsque je clique sur une ligne, la web méthode du style getAnimalByIdProprietaire(id_proprietaire) est appelée et rempli une seconde grille avec les animaux du propriétaire...

    (la première grille étant chargée avec le dataSource Propriétaire, et la seconde grille avec le dataSource Animal, avec un lien entre les 2 sur l'id_proprietaire)

  9. #9
    Membre chevronné
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Par défaut
    Je l'utilise comme sur le premier exemple de cette page

    http://noon.gilead.free.fr/gilead/in...=configuration

    Il faut l'utiliser avant de renvoyer ton objet via l'appel rpc.

  10. #10
    Membre chevronné
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Par défaut
    Pour etre plus clair, tu dois faire un persistentBeanManager.clone(animals) juste avant le return animals; de ton service

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 12
    Par défaut
    Merci beaucoup, je vais essayer.

    Une question me vient... Comment organiser ses dataSources une fois que j'aurai obtenu mes propriétaires avec leur collection d'animaux ? (=> 2 grilles)

  12. #12
    Membre chevronné
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Par défaut
    Vaste question.. tu peux étudier un projet que j'ai mis sur le web. Tu trouveras un exemple dans le repertoire exemple du svn de ce projet : http://gwtop.tuxfamily.org

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 12
    Par défaut
    Vaste question, pas tant que ça , mais la doc est pas fort explicite^^(je trouve)

    Si on veut prendre un exemple type avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TableA          TableB
    --------        ---------
    idA             idB
                    #idA

    On sélectionne un tuple de TableB. Comment déclarer la clé étrangère et dans quel datasource ? C'est plus évident en C#..
    Ca doit être tout simple, mais il faut le savoir ! Après la sélection du tuple de TableB et avec les datasources correctement configurés, le datasource de TableA se rempli automatiquement ?

    Merci

  14. #14
    Membre chevronné
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Par défaut
    Le vocabulaire n'est pas correct.

    Tu as une datasource pour ton application qui est géré au niveau de ton conteneur de Servlet. Normalement on utilise jndi pour pouvoir configurer facilement la datasource en fonction de l'environnement.

    1 datasource pour accéder à une base de données.

    Ensuite dans ton application tu utilsieras des DAO pour persister tes objets du domaine vers ta base et pour les récupérer.

    La bonne pratique étant de créer des sevrices qui vont utiliser des DAO pour intéragir avec la base de données.

    Tes regles métiers se trouveront dans ta couche service.

    Si tu jette un oeil à l'exemple que je t'ai donné tu comprendras mieux.

    Ensuite tu as plusieurs stratégie pour persister les objets les uns en fonctions des autres. Par exemple tu peux utiliser la méthode Cascade avec des annotations hibernate sur les getter de tes attributs. Ou sinon tu peux gérer ce mécanisme avec les DAO dans tes services.

Discussions similaires

  1. Réponses: 7
    Dernier message: 24/10/2011, 21h49
  2. Problème avec Gilead
    Par zinou57 dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 20/01/2010, 16h43
  3. Problème std::set avec une structure
    Par DeathMixer dans le forum C++
    Réponses: 4
    Dernier message: 03/10/2009, 01h05
  4. Problème d'E.S. sur fichier avec open
    Par Bubonik software dans le forum C
    Réponses: 6
    Dernier message: 04/02/2004, 19h42
  5. problème HD ntfs formaté sous WinXP avec win2000
    Par kalminou dans le forum Windows XP
    Réponses: 7
    Dernier message: 27/08/2003, 17h45

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