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 :

le retour du many-to-one


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Par défaut le retour du many-to-one
    Bonjour,
    je suis de nouveau confronté à un souçis dans le cadre de mon apprentissage d'hibernate.

    Soit mes deux objets "quote" et "security". les security sont associés à des quotes (relation un à plusieurs).
    les quotes, eux ne sont associés qu'à un et un seul security.

    Dans une BDR on traduirait cela par le fait qu'un quote a une foreign key qui référence la primary key d'un security.

    J'ai donc réalisé le mapping suivant:
    fichier BeanFinancialDataQuote.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
     
    <hibernate-mapping>
        <class name="beans.BeanFinancialDataQuote" table="quote">
    	<id name="id" column="id">
    		<generator class="sequence">
                           <param name="sequence">quote_id_seq</param>
                    </generator>
    	</id>
    	<property name="_price" column="quoteprice"/>
            <property name="_date" type ="timestamp" column="quotedate"/>
    	<many-to-one  name="security" class="beans.BeanFinancialDataSecurity" column="security_id" not-null="true"/>	
        </class>	
    </hibernate-mapping>
    fichier BeanFinancialDataSecurity.hbm.xml :
    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="beans.BeanFinancialDataSecurity" table="security">
    		<id name="id" column="id">
    				<generator class="sequence">
    					<param name="sequence">security_id_seq</param>
    				</generator>
    			</id>
    		<property name="_name" column="name" />
    		<property name="_isin" column="isin" />
    	</class>
    </hibernate-mapping>
    Maintenant dans mon appli je fais ce bout de code dans le main pour tester :
    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
     
    //		 je récupère ma session Hibernate
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
     
            session.beginTransaction();
    //      j'ajoute deux "security"
            BeanFinancialDataSecurity security = new BeanFinancialDataSecurity();
            security.set_isin("FR350653");
            security.set_name("air liquide");
            session.save(security);
     
            BeanFinancialDataSecurity security2 = new BeanFinancialDataSecurity();
            security2.set_isin("FR102921");
            security2.set_name("AXA");
            session.save(security2);
    // 		je récupère le security avec name ="axa" pour avoir son Id
            BeanFinancialDataSecurity securityLoaded = (BeanFinancialDataSecurity)session.createQuery("from BeanFinancialDataSecurity where _name='AXA'").uniqueResult();
     
    //		je fabrique un quote 
            BeanFinancialDataQuote quote = new BeanFinancialDataQuote() ;
            quote.set_price(500);
            quote.set_date(new Date());
    //		Je met la foreign Key qui correspond à Axa
            quote.setSecurity(securityLoaded.getId());
            System.out.println("----------- going to plant-------------");
            session.save(quote);
            System.out.println("----------- planted -------------");
            session.getTransaction().commit();
            System.out.println("commited");
    Le message d'erreur :

    ----------- going to plant-------------
    08:06:28,104 DEBUG ThreadLocalSessionContext:300 - allowing proxied method [save] to proceed to real session
    08:06:28,104 DEBUG DefaultSaveOrUpdateEventListener:158 - saving transient instance
    08:06:28,104 DEBUG AbstractBatcher:366 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
    08:06:28,104 DEBUG SQL:401 - select nextval ('quote_id_seq')
    Hibernate: select nextval ('quote_id_seq')
    08:06:28,104 DEBUG AbstractBatcher:484 - preparing statement
    08:06:28,114 DEBUG SequenceGenerator:82 - Sequence identifier generated: 1
    08:06:28,114 DEBUG AbstractBatcher:374 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
    08:06:28,114 DEBUG AbstractBatcher:533 - closing statement
    08:06:28,114 DEBUG AbstractSaveEventListener:112 - generated identifier: 1, using strategy: org.hibernate.id.SequenceGenerator
    08:06:28,124 DEBUG AbstractSaveEventListener:153 - saving [beans.BeanFinancialDataQuote#1]
    08:06:28,124 ERROR BasicPropertyAccessor:167 - IllegalArgumentException in class: beans.BeanFinancialDataSecurity, getter method of property: id
    Exception in thread "main" org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of beans.BeanFinancialDataSecurity.id
    at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:171)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:183)
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3591)
    at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3307)
    at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181)
    at org.hibernate.engine.ForeignKeys$Nullifier.isNullifiable(ForeignKeys.java:137)
    at org.hibernate.engine.ForeignKeys$Nullifier.nullifyTransientReferences(ForeignKeys.java:69)
    at org.hibernate.engine.ForeignKeys$Nullifier.nullifyTransientReferences(ForeignKeys.java:47)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
    at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
    at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
    at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
    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.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
    at $Proxy0.save(Unknown Source)
    at main.SecurityManager.createAndStore(SecurityManager.java:53)
    at main.SecurityManager.main(SecurityManager.java:21)
    Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
    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.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:145)
    ... 26 more

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Par défaut
    merci d'avance si quelqu'un voit une erreur "flagrante". Je suis bloqué dessus depuis 24h, ce doit être évident vu que je débute.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Par défaut
    il vous manque le property <one-to-many
    dans le fichier du mapping de security

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    De plus, sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    quote.setSecurity(securityLoaded.getId());
    il ne faut pas setter l'id mais l'objet lui même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    quote.setSecurity(securityLoaded);

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Par défaut
    merci à vous deux.
    Mon problème venait bien du fait que je voulais set un Id directement au lieu de laisser hibernate s'en charger en lui passant l'objet.
    Par contre il n'est pas nécessaire d'ajouter le lien one-to-many pour que cela fonctionne à priori.

    Si j'ai bien compris, ce lien me permettrait de faire du bi-directionel (à partir d'un quote récupérer son security) ? Si c'est bien ça je n'en ai pas besoin dans mon appli, donc je serais tenter de ne pas l'ajouter!

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Si tu n'as pas besoin de la relation bi-directionnelle, alors ne l'utilise pas.
    C'est juste que des fois, on se rend compte plus tard qu'on en a besoin, par exemple, pour l'ecriture d'un requête.

    Pense à mettre le sujet en résolu.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/07/2006, 14h45
  2. [Hibernate]POJO et many-to-one
    Par azpublic dans le forum Hibernate
    Réponses: 3
    Dernier message: 13/07/2006, 15h00
  3. html:select et hibernate many-to-one
    Par davdou dans le forum Struts 1
    Réponses: 1
    Dernier message: 05/07/2006, 14h56
  4. Hibernate : suppression sur relation many to one
    Par taf dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/05/2006, 13h08
  5. [hibernate] "many-to-one"
    Par mehdi_swatch dans le forum Hibernate
    Réponses: 26
    Dernier message: 12/05/2006, 20h11

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