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