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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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!

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